在Crystal中,继承和包含有什么区别?
In Crystal, what's the difference between inheritance and inclusion?
在大多数 Crystal 文档中,使用 class 继承,使用 <
语法(例如 )。
但是,HTTP::Handler
表示自定义处理程序必须 包括 HTTP::Handler
模块,而不是 继承自 一些class.
我在 Crystal 文档中找不到关于 include
-ing 模块应该做什么的描述,或者它与 <
-继承 classes.
class包含一个模块是什么意思?
包含的描述隐藏在“模块”规范中:https://crystal-lang.org/reference/syntax_and_semantics/modules.html
文档页面中的示例是:
An include makes a type include methods defined in that module as instance methods:
module ItemsSize
def size
items.size
end
end
class Items
include ItemsSize
def items
[1, 2, 3]
end
end
items = Items.new
items.size # => 3
还有相关的 extend
,其中包括模块成员作为 class 级成员而不是实例级成员。
这是定义 mixins 或其他命名空间的有用方法,它们并不意味着被实例化为对象。
包容也是一种继承。
主要区别实际上是扩展类型仅限于一个父级。整个程序的扩展继承图是一棵树。
相反,一个类型可以包含多个模块。并且两种类型之间可以有多个include继承路径。
在大多数 Crystal 文档中,使用 class 继承,使用 <
语法(例如
但是,HTTP::Handler
表示自定义处理程序必须 包括 HTTP::Handler
模块,而不是 继承自 一些class.
我在 Crystal 文档中找不到关于 include
-ing 模块应该做什么的描述,或者它与 <
-继承 classes.
class包含一个模块是什么意思?
包含的描述隐藏在“模块”规范中:https://crystal-lang.org/reference/syntax_and_semantics/modules.html
文档页面中的示例是:
An include makes a type include methods defined in that module as instance methods:
module ItemsSize
def size
items.size
end
end
class Items
include ItemsSize
def items
[1, 2, 3]
end
end
items = Items.new
items.size # => 3
还有相关的 extend
,其中包括模块成员作为 class 级成员而不是实例级成员。
这是定义 mixins 或其他命名空间的有用方法,它们并不意味着被实例化为对象。
包容也是一种继承。
主要区别实际上是扩展类型仅限于一个父级。整个程序的扩展继承图是一棵树。 相反,一个类型可以包含多个模块。并且两种类型之间可以有多个include继承路径。