在Ruby中继承是否可以进行类型转换?
我正在使用Ruby,并使用继承编写类 例如:在Ruby中继承是否可以进行类型转换?,ruby,oop,Ruby,Oop,我正在使用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 是否可以通过dog对象调用犬科动物的make_noise()方法
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
是否可以通过dog
对象调用犬科动物的make_noise()
方法
在其他语言中,它将是一个类型转换,类似于:
(Canine)jack.make_noise
注意,这不是Ruby语法,因此,我的问题是
在Ruby中可以做到这一点吗?如果是这样,怎么办?Ruby不允许以这种方式进行铸造或转换,至少在传统意义上不允许。无论如何,这很少是必要的,因为Ruby是基于而不是一个严格的类型系统 你在期待电话里的“嗖嗖”声吗?只有C++这样的更严格的类型化语言,才会发生非虚拟方法。这与正确的面向对象设计背道而驰 如果您探索面向对象设计中所采用的方法,您总是可以用另一种方法解决此类问题 这里您可能需要一个演示者来处理
make\u noise
功能
否则,您将需要编写一个
to_canine
方法,该方法可以转换为基类型,尽管还不清楚为什么需要这样的方法。您可以这样做:
d = Dog.new
d.class.superclass.instance_method(:make_noise).bind(d).call
Canine.instance_method(:make_noise).bind(jack).call
或
。不漂亮!我不确定是否有更好的方法
编辑:我想我同意这里的其他答案,因为Ruby的OO方法将允许您访问其他模式,这些模式可以实现这个构造可能帮助您实现的任何目标(可能在其他语言中)。我没有看到这种类/超类方法在我参与的项目中实际应用。您可以这样做:
d = Dog.new
d.class.superclass.instance_method(:make_noise).bind(d).call
Canine.instance_method(:make_noise).bind(jack).call
一个更好的计划是只给超类中的方法一个别名,或者重命名它。我不知道为什么需要它,根据需要,它可能会完全不同,但由于知识有限,我建议这样做
class Dog < Canine
def initialize
end
def make_noise only_parent=false
puts "wong wong" if !only_parent
super
end
end
class狗<犬科
def初始化
结束
def make_noise only_parent=false
放“黄黄”如果!只有父母
超级的
结束
结束
或
class狗<犬科
def初始化
结束
别名:make_super_噪波:make_噪波
制造噪音
放上“嗖嗖”
超级的
结束
结束
您想只调用犬科的制造噪音
方法,还是让犬科。制造噪音
调用它?如果是后者,那么它将按原样工作。initialize
,而不是initialize
@为什么要这样做?+1更好的计划是只给超类中的方法一个别名,或者重命名它。谢谢。我也会考虑其他解决方案。您将如何编写to_canine()方法?因为这会解决我的问题:杰克。给狗。制造噪音。我真的建议你不要那样做。Ruby中常用的to
方法有to\u i
、转换为整数或转换为字符串。它们很轻,实现起来也很简单。您可能需要允许initialize
接收任意对象并将其转换为犬科动物,因此to_Canine
大致上是Canine.new(self)
。你所做的与Smalltalk设计原则背道而驰,只会制造麻烦。它甚至违背了正确的C++设计实践。简言之,这似乎是个坏主意。谢谢。语法有点冗长,不是面向对象的。有可能得到父对象吗?换句话说,让这个对象表现得像其父类的对象吗?@Zack Xu:据我所知,在Ruby core中并不是这样,尽管你可以基于方法内省来做一些类似于合理语法的事情。问题是,可能会创建这样一个助手函数无法正确支持的Ruby类和对象。Zack Xu:实际上,没有父对象可供您获取。你必须自己创造它。有一个类为Dog的对象具有一组特定的实例变量和方法。如果出于某种原因需要获取父对象,那么它可能应该是一个单独的对象,狗可以只保留对它的引用(即停止使用子类化,使用不同类型的关系)。
class Dog < Canine
def initialize
end
alias :make_super_noise :make_noise
def make_noise
puts "whoosh whoosh"
super
end
end