3

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
4

1 回答 1

1

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

所以,考虑:

  • MyFooView每个版本都有一个版本的原因是什么FooView?只是包含mixins吗?
  • 也许所有的Views 都有一个共同的父级,你可以添加这个 mixin?
  • mixin 是否包含用于其他用途的功能View?为什么不直接将其添加到父级View
  • 如果 mixin 真的独立于View类,为什么它本身不只是一个类,以便每个View人都拥有它的一个实例?
于 2014-04-15T22:26:33.063 回答