Smalltalk棘手的语法

时间:2016-02-10 11:54:08

标签: smalltalk

在一个考试例子中,他们询问该陈述是否有效,如果是,则返回:

  

对象类超类类

我不能自己跟踪那么多信息。请帮助!

2 个答案:

答案 0 :(得分:3)

假设Object是类型系统的根,您只需要仔细遵循规则:

  1. 每个普通类X都是其元类X class
  2. 的一个实例
  3. 每个元类X class都是普通类Metaclass的实例。
  4. 元类继承图遵循常规对象继承图,只是当根对象继承自nil时,其元类继承自Class
  5. 所以它会是:

    |             Expression              |     Type     |
    |-------------------------------------|--------------|
    | Object                              | Object       |
    | Object class                        | Object class |
    | Object class superclass             | Class        |
    | Object class superclass class       | Class class  |
    | Object class superclass class class | Metaclass    |
    

    在实践中,Object不是根,其父ProtoObject是;因此,如果考试作者考虑到这一点,则上述内容将以Metaclass class结束。

答案 1 :(得分:0)

表达式的一个有趣方面

Object class

的答案不是Class,而是Metaclass

Object class不是Class的原因是Metaclass不是Class的子类。更重要的是,Object class不会继承Class中定义的行为。

当然,有人可能会说,在同一标准Object不会是Class,因为它不是Class的实例,而是其元类(即,Object class。)但这仅仅是因为一些技术性问题(或实施细节,如果你愿意的话。)事实是Object(和这个问题的所有其他类)继承了{{1这就是为什么我们说它们是类,它们表现为Class的实例(有趣的是,根本没有实例。)

实现此属性的方法包括执行以下等式

Class

由于这种关系,ProtoObject class superclass == Class 的类侧继承了ProtoObject的(实例)行为(即使Class没有子类。)

现在,为什么表达

Class

有道理吗?如果Object class superclass 的接收者甚至不是一个类,它应该理解消息superclass吗?

答案是肯定的,不仅类而且元类具有superclass。在这里,原因再次与继承的行为有关。

每个程序员都希望如果类superclass继承自A,那么B将继承A class类侧的所有方法。换句话说,

B

或等同地

A class superclass == B class

但是请注意,正如我们在上面看到的那样(A class superclass == A superclass class 。} {/ 1>},这种关系并不适用于A == ProtoObject

所以,在ProtoObject class superclass == Class的情况下,表达式

ProtoObject

变为

Object class superclass class class

Object superclass class class class

ProtoObject class class class

因为Metaclass class ProtoObject class的一个实例,所以Metaclassclass

要完成答案,请计算

Metaclass

在这种情况下,我们得到

ProtoObject class superclass class class

Class class class