Ruby中的多重继承

时间:2013-07-10 11:17:39

标签: ruby mixins

Ruby中的多重继承是通过包含模块来模拟的,但是不可能直接从模块(不是类)继承属性。我提出的解决方案是定义模块初始化的属性(下面的代码)。与下面的代码相比,是否有更好的方法来实现多重继承(继承方法和属性)?

module MyCustomMixin
    attr_accessor :a

    def initialize
        self.a = 1
    end

    def b
        "something"
    end
end

class MyCreateView < CreateView
    include MyCustomMixin
end

class MyReadView < ReadView
    include MyCustomMixin
end

class MyUpdateView < UpdateView
    include MyCustomMixin
end

class MyDeleteView < DeleteView
    include MyCustomMixin
end

1 个答案:

答案 0 :(得分:1)

问题是,这在技术上是可行的,但它需要一些看起来不太漂亮的finagling(尤其是使用#initialize) - 这是理所当然的。如果唯一的目的是防止代码重复,我不建议以这种方式编写代码。

所以,请考虑:

  • 每个MyFooView拥有FooView版本的原因是什么?它只是包含mixins?
  • 也许所有View都有一个共同的父母,你可以添加这个混合?
  • mixin是否包含View以外的功能?为什么不直接将其添加到父View
  • 如果mixin真的独立于View类,为什么它本身不是一个类,所以每个View都拥有它的一个实例?