为了理解BasicObject, Object, and Kernel
如何相互影响,我想到了以下代码,这些代码可以从David A Black的书的页面#100 中找到:
class BasicObject
# a scant seven method definitions go here
end
module Kernel
# over 100 method definitions go here!
end
class Object < BasicObject
# one or two private methods go here,
# but the main point is to mix in the Kernel module
include Kernel
end
Object是BasicObject的子类。每个没有明确超级的班级 class是Object的子类。您可以在irb中看到此默认值的证据:
class C
end
#=>nil
C.superclass
#=>Object
好的,但是David Black的下面 BOLD 行在他的书中让我很难理解:
“每个类都有对象 - 因此内核和BasicObject
- 它的祖先.ofcourse, 仍然存在BasicObject
是Object
的悖论,并且Object
是Class
,而Class
是Object
。但正如您之前看到的,类模型中的一些循环用于启动层次结构;以及一旦开始运作,它就会在逻辑上干净利落地运作。“
以下是我的问题:
BasicObject
为Object
,Object
为Class
,Class
是Object
?circularity
?答案 0 :(得分:3)
你混淆了“是”的两个含义:“实例”和“子类”。
1)关于子类关系:
Class
是Module
。Module
是Object
。Object
是BasicObject
。由于传递性,Class
是Object
和BasicObject
的子类,Module
是BasicObject
的子类。但这里没有循环。例如,BasicObject
不是Class
,Module
或Object
的子类。
2)关于实例化关系:
Class
是Class
的实例(以及[种类] Module
,Object
,BasicObject
)。Module
是Class
的实例(以及[种类] Module
,Object
,BasicObject
)。Object
是Class
的实例(以及[种类] Module
,Object
,BasicObject
)。BasicObject
是Class
的实例(以及[种类] Module
,Object
,BasicObject
)。但实例化关系中没有循环性。循环性是关于传递关系的概念。例如,如果A → B
和B → C
,则A → C
由于传递性而遵循,如果它也是C → A
,则存在循环性。但是实例化关系不是传递性的。 “A是B的实例”,“B是C的实例”并不意味着“A是C的实例”。因此,不能以非平凡的方式在实例化关系中定义循环性。