我正在使用Ruby,并使用继承编写类。
例如:
class Canine
def initialize
end
def make_noise
puts "whoosh whoosh"
end
end
class Dog < Canine
def initialize
end
def make_noise
puts "wong wong"
super
end
end
现在我有一个狗对象:
jack = Dog.new
是否可以通过make_noise()
对象调用Canine的dog
方法?
在其他语言中,它将是类型转换,例如:
(Canine)jack.make_noise
请注意,这不是Ruby语法,因此,我的问题。
可以在Ruby中执行此操作吗?如果是这样,怎么样?
答案 0 :(得分:4)
您可以这样做:
Canine.instance_method(:make_noise).bind(jack).call
更好的计划是给超类中的方法一个别名,或者重命名它。
答案 1 :(得分:3)
Ruby不允许以这种方式进行转换或转换,至少不是传统意义上的转换。无论如何,这很少是必要的,因为Ruby基于duck typing而不是刚性类型系统。
你是否期待通话中的“嗖嗖嗖”?这种情况只会发生在非严格类型语言(如C ++)中的非虚方法中。这违背了适当的面向对象设计。
如果你探索面向对象设计中使用的design patterns,你总能以另一种方式解决这类问题。
您可能需要的是一位处理make_noise
功能的演示者。
否则你需要编写一个可以转换为基本类型的to_canine
方法,但仍然不清楚为什么你需要这样的东西。
答案 2 :(得分:3)
你可以这样做:
d = Dog.new
d.class.superclass.instance_method(:make_noise).bind(d).call
或
Canine.instance_method(:make_noise).bind(d).call
。 。 。不漂亮!我不确定是否有更好的方式
编辑:我认为我同意其他答案,因为Ruby的OO方法将允许您访问其他模式,以实现此构造可能帮助您的任何目标(可能在其他语言中)。在我参与的项目中,我没有看到这种类/超类方法的实践。
答案 3 :(得分:0)
我不确定你为什么需要这个,根据需要它可能会完全不同,但我知道这个知识有限
class Dog < Canine
def initialize
end
def make_noise only_parent=false
puts "wong wong" if !only_parent
super
end
end
或
class Dog < Canine
def initialize
end
alias :make_super_noise :make_noise
def make_noise
puts "whoosh whoosh"
super
end
end