Smalltalk超类vs元类?

时间:2010-01-25 04:14:33

标签: smalltalk metaclass superclass

我是OOP的新手,但有一个“程序”背景。

我目前正试图通过GNU Smalltalk和Lovejoy的“Smalltalk:获取消息”来了解OOP。

我对元类和Metaclass类与超类相比感到困惑。我可以看到超类的继承流程 - > class - >子类;但我不知道元类如何适合/在哪里.TIA ......

4 个答案:

答案 0 :(得分:6)

免费在线书籍Pharo by Example,第13章(类和元类)中有一个很好的描述。本章中解释的内容对于所有Smalltalk实现都是通用的。

答案 1 :(得分:4)

实际上有两个级别的继承:实例继承和类继承。

Smalltalk有一个特殊的方案,可以将作为对象传递。这意味着类也是其自身权利中的对象。元类是“简单地”类对象的类。

它不会干扰正常的实例继承,因此它不适合您使用的superclass -> class -> subclass图表中的任何位置。

答案 2 :(得分:3)

基于类的OO中有两个不同的关系:实例化继承

实例化是对象与其类之间的关系new关键字等。通常它是由低级表示中的指针实现的任何对象。在Smalltalk中,anObject class遍历此指针;同样,类也是对象,类的类称为元类,但这与实例的关系相同。

继承是类之间的关系。你可以通过aClass superclass从一个类转到它的超类,并继续这样做,直到你进入类Object。在Smalltalk中,超类指针只是在所有类上定义的实例变量,superclass消息是普通访问者。

答案 3 :(得分:0)

作为一个概念,superclass是对象类的父级。即Class层次结构中的Class级别高于当前对象的Class。

作为命名方法,它返回接收者的直接超类的名称。 例如它在Squeak Smalltalk(以及它的衍生品,Pharo和Cuis)中定义为 superclass "Answer the receiver's superclass, a Class." ^superclass

在Dolphin Smalltalk中,它被定义为 `超     "回答哪一个是接收者的直接答案     超类(或者如果没有)。"

^superclass'

但是 - Class层次结构中的每个Class实际上都是其父类的一个实例。因此,给定类是其实例的类是Class的MetaClass。

所以,例如 aSortedCollection是一个对象 - Class SortedCollection的一个实例。

SortedCollection是一个名为Class' SortedCollection'在可浏览的类层次结构中。同时,它也是 Metaclass的一个实例 - 一个匿名类,它有一个单例对象实例,它是一个命名类。命名类在类层次结构中可见,但Metaclass(匿名)更不可见。它就是Smalltalk

Smalltalk维护一个Metaclass层次结构,即类的类的层次结构。它不太可见,因为它作为匿名系统对象保存,但您可以在类浏览器中找到Metaclass层次结构的顶层。类Class和类Metaclass都可以作为类Behaviour的子子类找到,它本身就是类Object的子类。

人们说"在Smalltalk中,一切都是对象的一个​​原因"是因为类Object是所有其他类和对象的根 - 它位于对象层次结构的最顶层,它包含Class层次结构和Metaclass层次结构。

(通常在这个阶段,我的大脑开始流出我的耳朵,但是接下来的3分有助于将它全部推回到我的头骨中)

如果您发送消息anInstanceOfAClass class - 您将获得支付 返回的对象anInstanceOfAClass的类。

如果您发送消息anInstanceOfAClass class superclass - 您将获得支付 返回的对象anInstanceOfAClass的类的父类。

如果你发送消息anInstanceOfAClass class class - 你就会得到 对象anInstanceOfAClass返回的类的匿名单例Metaclass。