-1

为了理解它们是如何BasicObject, Object, and Kernel相互作用的,我想到了下面的代码,它是从David A Black 的书的page#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 的子类。每个没有显式超类的类都是 Object 的子类。您可以在 irb 中看到此默认值的证据:

class C
end
#=>nil
C.superclass
#=>Object

好的,但是大卫布莱克在他的书中下面的粗体线条让我感到困惑理解:

“每个类都有 Object ——因此是 Kernel 和BasicObject——在它的祖先中。当然,仍然存在一个悖论,BasicObject即一个ObjectObject一个ClassClass一个Object。但正如你之前看到的,类模型中的一点循环有助于跳跃- 启动层次结构;一旦启动,它就会合乎逻辑地运作,而且干净利落。”

以下是我的问题:

  1. 为什么他提到这种关系是一个悖论, 并且是一个,并且 是一个?BasicObjectObjectObjectClassClassObject
  2. circularity他在这里想说什么?
4

1 回答 1

3

您混淆了“是”的两个含义:“实例”和“子类”。

1)关于子类关系:

  • Class是 的子类Module
  • Module是 的子类Object
  • Object是 的子类BasicObject

并且由于传递性,Class是 和 的子类ObjectBasicObject并且Module是 的子类BasicObject。但这里没有循环。例如,BasicObject不是 、 或 的ClassModuleObject

2)关于实例化关系:

  • ClassClass(以及 (种类) of Module, Object, BasicObject) 的一个实例。
  • ModuleClass(以及 (种类) of Module, Object, BasicObject) 的一个实例。
  • ObjectClass(以及 (种类) of Module, Object, BasicObject) 的一个实例。
  • BasicObjectClass(以及 (种类) of Module, Object, BasicObject) 的一个实例。

但是实例化关系没有循环性。循环性是在传递关系上定义的概念。例如,如果A → B和,那么由于传递性,B → C那么它遵循,如果它也是,那么就有循环性。但是实例化关系不是传递的。“A 是 B 的实例”和“B 是 C 的实例”并不意味着“A 是 C 的实例”。因此,不能以非平凡的方式在实例化关系上定义循环性。A → CC → A

于 2013-02-23T09:33:42.893 回答