作者godfat (godfat 真常)
看板Ruby
标题Re: [问题] super真的不能呼叫其他方法吗?
时间Sun Dec 7 02:24:58 2008
※ 引述《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
1F:推 ogamenewbie:Sup'a'r? @@a 12/07 08:03
2F:→ poga:故意取名跟super不相冲 12/07 13:59
3F:→ godfat:其实是日文 XD p.s. 对,只是避免同名冲突 12/07 15:46
4F:推 zero00072:谢谢版主!我来试试看。 12/07 23:22