在Ruby中,由于可以包含多个mixin,但只能扩展一个类,因此mixin似乎比继承更受欢迎.
我的问题:如果你写的代码必须经过扩展/包含才能有用,为什么你要把它变成一个类?或者换句话说,你为什么不把它变成一个模块呢?
我只能想到一个你想要一个类的原因,那就是如果你需要实例化这个类.然而,在ActiveRecord::Base的情况下,您从未直接实例化它.那么,它不应该是一个模块吗?
在Ruby中,由于可以包含多个mixin,但只能扩展一个类,因此mixin似乎比继承更受欢迎.
我的问题:如果你写的代码必须经过扩展/包含才能有用,为什么你要把它变成一个类?或者换句话说,你为什么不把它变成一个模块呢?
我只能想到一个你想要一个类的原因,那就是如果你需要实例化这个类.然而,在ActiveRecord::Base的情况下,您从未直接实例化它.那么,它不应该是一个模块吗?
我在100篇(顺便说一句,这本书很棒)中读到了这个话题.作者在解释方面比我做得更好,所以我将引用他的话:
没有任何一条规则或公式总能产生正确的设计.但是保持一个
Modules don’t have instances.因此,实体或事物通常是最好的
A class can have only one superclass, but it can mix in as many modules as it wants.如果
在一个例子中总结这些规则,下面是你不应该做的:
module Vehicle
...
class SelfPropelling
...
class Truck < SelfPropelling
include Vehicle
...
相反,你应该这样做:
module SelfPropelling
...
class Vehicle
include SelfPropelling
...
class Truck < Vehicle
...
第二个版本对实体和属性进行了更加简洁的建模.卡车