我是OOP的新手,但有一个“程序”背景。
我目前正试图通过GNU Smalltalk和Lovejoy的“Smalltalk:获取消息”来了解OOP。
我对元类和Metaclass类与超类相比感到困惑。我可以看到超类的继承流程 - > class - >子类;但我不知道元类如何适合/在哪里.TIA ......
答案 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。