Re: [問題] super真的不能呼叫其他方法嗎?
※ 引述《zero00072 (叮釘無產者)》之銘言:
: 環境:
: Ruby 1.8.7
: 狀況:
: 我們老師在上「物件導向程式設計」時,選了Java來當他的教學語言
: (我偏要跟他唱反調,用Ruby來寫……,還附上Java的程式碼,免得被當),
很好,我很感動 XD
: 但現在,我們老師教到繼承,Java裡有super()的方法可以用,如下:
事實上這個 super 跟 this 一樣,不是 method, 可以想成
某種特別的 variable (reference), 所以有型別的效力在。
比較像是 scoping 用的東西。
: def m2
: ???? # 用super會找不到父類別同名方法。
: end
: ????不知道打什麼,我看了Ruby Doc,只找到呼叫父類別同名方法的super,
: 有沒有辦法像Java那樣呼叫其他的方法的super?
: 還是這是下一版Ruby的開發目標之一?
事實上你是沒有辦法直接呼叫到的,只有撇步,例如:
(其實都很 trivial, 這不可能會是下一版 ruby 的目標)
(而且通常都會用 alias/alias_method 來替代,畢竟在動態的世界裡,)
(override 就是 override, 通常不會有必要呼叫異名的 super method.)
抓出 A 的 instance method 再把自己 bind 過去:
def m2
A.instance_method(:m1).bind(self).call
end
不想看到 A? 可以改成 superclass:
def m3
self.class.superclass.instance_method(:m1).bind(self).call
end
abstract 出來:
module Kernel
# 盡量不要同名於 super
def supar msg
self.class.superclass.instance_method(msg).bind(self).call
end
end
就能寫成:
def m4
supar(:m1)
end
希望能更像 java 嗎?沒問題,加個 delegator, 讓你寫成:
def m5
supar.m1
end
就這樣:
# BasicObject 在 1.9 才有,其實就是幾乎沒有 method 的 Object.
# 約略等於 BlankSlate, 很多 ruby lib 都有做的 class.
class SuparInvoker < BasicObject
def initialize obj; @obj = obj; end
def method_missing msg, *args, &block
@obj.class.superclass.instance_method(msg).bind(@obj).
call(*args, &block)
end
end
module Kernel
def supar
SuparInvoker.new(self)
end
end
沒什麼特別的... 事實上也沒什麼用 :s
--
Hear me exalted spirits. Hear me, be you gods or devils, ye who hold
dominion here:
I am a wizard without a home. I am a wonderer seeking refuge.
Sacrifice
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18
推
12/07 08:03, , 1F
12/07 08:03, 1F
→
12/07 13:59, , 2F
12/07 13:59, 2F
→
12/07 15:46, , 3F
12/07 15:46, 3F
推
12/07 23:22, , 4F
12/07 23:22, 4F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 2 之 3 篇):