在 Ruby 中,由于您可以包含多个混入但只能扩展一个类,因此混入似乎优于继承。
我的问题:如果您正在编写必须扩展/包含才能有用的代码,您为什么要把它变成一个类?或者换句话说,你为什么不总是把它做成一个模块?
我只能想到您想要一个类的一个原因,那就是您是否需要实例化该类。然而,在 ActiveRecord::Base 的情况下,您永远不会直接实例化它。那么它不应该是一个模块吗?
最佳答案
我只是在 The Well-Grounded Rubyist 中阅读了有关此主题的信息(顺便说一句,好书)。作者比我解释得更好,所以我会引用他的话:
没有任何单一的规则或公式总能得出正确的设计。但保持一个 在做出类与模块的决定时,请牢记几个注意事项:
模块没有实例。因此实体或事物通常是最好的 在类中建模,实体或事物的特征或属性是 最好封装在模块中。相应地,如第 4.1.1 节所述,类 名称往往是名词,而模块名称通常是形容词(堆栈 与 Stacklike)。
一个类只能有一个父类(super class),但它可以混合任意多个模块。如果 你正在使用继承,优先创建一个合理的父类(super class)/子类 关系。不要用完一个类的唯一父类(super class)关系 赋予类(class)可能只是几组特征之一的特征。
在一个例子中总结这些规则,这是你不应该做的:
module Vehicle
...
class SelfPropelling
...
class Truck < SelfPropelling
include Vehicle
...
相反,你应该这样做:
module SelfPropelling
...
class Vehicle
include SelfPropelling
...
class Truck < Vehicle
...
第二个版本对实体和属性的建模更加简洁。卡车 继承自 Vehicle(这是有道理的),而 SelfPropelling 是车辆的一个特征(至少,我们在这个世界模型中关心的所有那些)——由于 Truck 是后代而传递给卡车的特征,或者专门 形式, 车辆.
关于ruby 继承 vs mixins,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1282864/