[英]Smalltalk superclass vs metaclass?
我是OOP的新手,但具有“程序”背景。
我目前正试图通过GNU Smalltalk和Lovejoy的“Smalltalk:获取消息”来了解OOP。
我对metaclass和Metaclass类与超类相比很困惑。 我可以看到超类的继承流 - > class - > subclass; 但是我不知道元类是如何适应的.TIA ......
在免费的在线书籍Pharo by Example ,Chapter 13(Classes and metaclasses)中有一个很好的描述。 本章中解释的内容对于所有Smalltalk实现都是通用的。
实际上有两个级别的继承:实例继承和类继承。
Smalltalk有一个特殊的方案,可以将类作为对象传递。 这意味着类也是自己权利的对象 。 元类是“简单地”类对象的类。
它不会干扰正常的实例继承,因此它不适合您使用的superclass -> class -> subclass
图中的任何位置。
基于类的OO有两种不同的关系: 实例化和继承 。
实例化是对象与其类 , new
关键字等之间的关系。通常它是由任何对象的低级表示中的指针实现的。 在Smalltalk中, anObject class
遍历此指针; 同样,类也是对象,类的类称为元类,但这与实例的关系相同。
继承是类之间的关系。 您可以通过执行aClass superclass
从一个类转到它的超aClass superclass
,并继续这样做,直到你到达Object
类。 在Smalltalk中,超类指针只是在所有类上定义的实例变量,而superclass
消息是普通访问器。
作为一个概念, superclass
是对象superclass
的父类。 即Class层次结构中的Class级别高于当前对象的Class级别。
作为命名方法,它返回接收者的直接超类的名称。 例如,它在Squeak Smalltalk(以及它的衍生物,Pharo和Cuis)中被定义为superclass "Answer the receiver's superclass, a Class." ^superclass
superclass "Answer the receiver's superclass, a Class." ^superclass
在Dolphin Smalltalk中,它被定义为“超类”答案是接收者的直接超类(或者如果没有)。“
^superclass'
但是 - 类层次结构中的每个类实际上都是其父类的实例。 因此,给定类是其实例的类是Class的MetaClass。
因此,例如aSortedCollection是一个对象 - Class SortedCollection的一个实例。
SortedCollection是可浏览的类层次结构中的类命名类“SortedCollection”。 同时,它也是 Metaclass的一个实例 - 一个匿名类,它有一个单例对象实例,它是一个命名类。 命名类在类层次结构中可见,但Metaclass(匿名)更不可见。 它就是Smalltalk
Smalltalk维护一个Metaclass层次结构,即类的类的层次结构。 它不太可见,因为它作为匿名系统对象保存,但您可以在类浏览器中找到Metaclass层次结构的顶级。 Class Class
和Class Metaclass
都被认为是Class Behaviour
的子类,它本身就是Class Object
的子类。
人们说“在Smalltalk中,一切都是对象”的一个原因是因为类Object
是所有其他类和对象的根 - 它位于对象层次结构的最顶层,它包含类层次结构和元类层次结构。
(通常在这个阶段,我的大脑开始从我的耳朵流血,但是以下3点帮助将它全部推回到我的头骨中)
如果你发送消息anInstanceOfAClass class
- 你会得到
返回的对象anInstanceOfAClass的类。
如果你发送消息anInstanceOfAClass class superclass
- 你会得到
返回的对象anInstanceOfAClass的类的父类。
如果发送消息anInstanceOfAClass class class
- 您将获得对象anInstanceOfAClass返回的类的匿名单例Metaclass。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.