ruby 继承 vs mixins

标签 ruby class inheritance module mixins

在 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/

相关文章:

c++ - 尽管类名与 C++ 完全匹配,但模板化基类初始化构造函数失败

c++ - 类对象指针不会分配给字符串

matlab - 没有足够的输入参数继承Matlab

css - 有没有办法用 Selenium 测试响应式 CSS?

Ruby grep - 在数组中搜索字符串的一部分

python - 类可以使用 __init__ 方法来创建同一类的其他实例吗?

java - 尽管实现了 Serialized,为什么我还是收到 java.io.NotSerializedException : Investment. Date?

Java Final 类或私有(private)构造函数

在字符串数组中查找字符串的 Ruby 方法

ruby - 使用 rake 任务与 heroku 交互