繁体   English   中英

Smalltalk超类vs元类?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM