Ruby的单一继承问题

时间:2017-07-06 01:30:50

标签: ruby oop inheritance conceptual

我需要一些帮助来定义一个示例,说明为什么Ruby中的单继承是一个问题。 单个类继承无法解决问题。

请考虑这是Ruby面对OO的局限性的抽象示例。我试图想出几个例子,但不断提出来。

然后,我们的想法是使用模块为Ruby面临的这个问题提供解决方法。

非常感谢任何帮助。如果您在下面看到我的示例,那么很高兴得到关于它是否证明上述问题的任何反馈。

Person超类和Pet超类不属于同一个类层次结构但共享相同的实例方法swim。出于这个原因,游泳实例方法被放置在一个模块中并混合到每个超类中。

module Swimming
    def swim
      puts 'I can swim'.
    end
end

class Person

    include Swimming

    def initialize(name)
      @name = name
    end
end

class Boy < Person 
end

class Pet
    include Swimming

    def initialize(name)
      @name = name
    end
end

class Fish < Pet
end

new_boy = Boy.new('Oliver')
new_fish = Fish.new('Ronald')

1 个答案:

答案 0 :(得分:1)

只要您想要包含多个地方的功能,就可以使用Mixins。其他一些语言使用多重继承。

module Swimming; end
module Bicycling; end

class Person
  include Swimming
  include Bicycling
end

如果有一个类只使用了一个mixin,那么可以很容易地将其更改为基于继承的实现:

class Swimming; end # not a module
class Amoeba < Swimming
end

但是在没有创建包装模块的中间类的情况下,Person类无法做类似的事情。

class SwimmingAndBicycling
  include Swimming
  include Bicycling
end
class Person < SwimmingAndBicycling
end

因此,模块实际上是将2多个功能组合成第三个功能的唯一简单方法。 Ruby是一种非常灵活的语言,有很多方法可以解决这个问题,例如手动将方法从一个类复制到另一个类。但这是标准方法。

另外值得一提的是,课程和模块有一些实用的差异,我在这里没有涉及。例如,在继承中,所有实例和类方法都被复制,但是对于模块,这取决于是否调用include或extend。