区分类继承和模块包含的表示法

时间:2012-10-15 00:59:56

标签: ruby class module uml notation

显示模块的祖先时,例如String

String, Comparable, Object, Kernel, BasicObject

其中一些(String,Object,BasicObject)是类,而其他则不是。有没有区分它们的符号?想到的一个可能的候选人是使用<<而不是<来包含模块:

String << Comparable < Object << Kernel < BasicObject

或相反,对于类继承:

String < Comparable << Object < Kernel << BasicObject

但我不确定。如果那里没有符号,您如何看待上述内容?这是如何在UML中表达的?

1 个答案:

答案 0 :(得分:2)

我知道没有这样的符号。

但是,在大多数情况下,我认为没有必要。一般来说(这里可能有一些警告,但我现在不能想到),一旦模块是祖先链的一部分,它的行为就像祖先链中的一个类。要使用您的String示例,''.is_a? Comparable返回true并在String中的方法中调用super,Comparable定义的方法将调用Comparable的实现。

唯一的区别在于initialize,因为您无法创建模块的实例。

对于UML,鉴于此,它可以像一个类(我认为)一样只是一个普通的祖先,因为我不相信UML有任何不同的表示模块的方式。

就我个人而言,我认为你提出的符号有点难以解析,而当我关心时,我宁愿把它全部拼写出来:

a = String.ancestors
a.map{ |c| c.class.to_s.downcase }.zip(a).map { |o| o.join(' ') }.join(' < ')
#=> "class String < module Comparable < class Object < module PP::ObjectMixin < module Kernel < class BasicObject"