我需要一些帮助来定义一个示例,说明为什么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')
答案 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。