Ruby中的继承是否可以进行类型转换?

时间:2013-04-26 15:16:29

标签: 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

现在我有一个狗对象:

jack = Dog.new

是否可以通过make_noise()对象调用Canine的dog方法?

在其他语言中,它将是类型转换,例如:

(Canine)jack.make_noise

请注意,这不是Ruby语法,因此,我的问题。

可以在Ruby中执行此操作吗?如果是这样,怎么样?

4 个答案:

答案 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