在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()方法

我正在使用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()
方法

在其他语言中,它将是一个类型转换,类似于:

(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