Smalltalk超类vs元类?

Smalltalk超类vs元类?,smalltalk,metaclass,superclass,Smalltalk,Metaclass,Superclass,我是OOP新手,但有“过程”背景 我目前正试图通过GNU Smalltalk和Lovejoy的“Smalltalk:获取信息”来了解OOP 我搞不清楚元类和元类类到底是什么,还是超类。我可以看到超类->类->子类的继承流程;但我不知道元类如何/在哪里适合。TIA…实际上有两个继承级别:实例继承和类继承 Smalltalk有一个特殊的方案,可以将类作为对象传递。这意味着类本身也是对象。元类“只是”类对象的类 它不会干扰正常的实例继承,因此它不适合您使用的超类->类->子类图中的任何地方。免费在线书

我是OOP新手,但有“过程”背景

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


我搞不清楚元类和元类类到底是什么,还是超类。我可以看到超类->类->子类的继承流程;但我不知道元类如何/在哪里适合。TIA…

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

Smalltalk有一个特殊的方案,可以将类作为对象传递。这意味着类本身也是对象。元类“只是”类对象的类


它不会干扰正常的实例继承,因此它不适合您使用的
超类->类->子类
图中的任何地方。

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

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

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


继承是类之间的关系。通过执行
aClass superclass
,您可以从一个类转到它的超类,并一直这样做,直到到达类
对象。在Smalltalk中,超类指针只是在所有类上定义的一个实例变量,
超类
消息是一个普通的访问器。

作为一个概念,
超类
是对象类的父类。i、 e.类层次结构中比当前对象的类高一级的类

作为命名方法,它返回接收方的直接超类的名称。 e、 它在Squeak Smalltalk(及其衍生产品Pharo和Cuis)中被定义为
超类
回答接收者的超类,a类
^超类

在Dolphin Smalltalk中,它的定义是 `超类 “回答a,这是接收者的直接回答 超类(或如果没有)。”

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

所以,例如。 aSortedCollection是一个对象—SortedCollection类的实例

SortedCollection是可浏览类层次结构中名为“SortedCollection”的类。同时,它也是一个元类的实例——一个匿名类,它有一个单例对象实例,这是一个命名类。命名类在类层次结构中是可见的,但元类(匿名)则不那么可见。它就在那里,所以说闲话

Smalltalk维护元类层次结构,即类的类的层次结构。它的可视性要差得多,因为它是作为匿名系统对象保存的,但是您可以在类浏览器中找到元类层次结构的顶层。类
和类
元类
都是类
行为
的子类,其本身是类
对象
的子类

人们说“在Smalltalk中,一切都是对象”的一个原因是因为类
object
是所有其他类和对象的根-它位于对象层次结构的最顶端,其中包含类层次结构和元类层次结构

(通常在这个阶段,我的大脑开始从耳朵里流血,但下面的3点帮助我将其全部推回到头骨中)

如果您发送消息
一个InstanceFaclass
-您将得到
AnInstanceFacClass返回的对象的类

如果您发送消息
一个InstanceFaclass类超类
,您将得到
AnInstanceFaClass返回的对象类的父类

如果您发送消息
aninstanceofclass
,您将获得
AnInstanceFaClass对象类的匿名单例元类返回。

@zneak->“元类“只是”类对象的类。我以为超类是“类对象的类”。这真的是我的问题-超类和元类之间的区别是什么?“实际上继承有两个层次:实例继承和类继承。”从这个公式中,我猜你混淆了继承和实例关联……这就是我的意思。子类可以覆盖我们在其他语言中所称的静态方法。谢谢链接!似乎是我要找的。你应该包括回答这个问题的书的要点,而不仅仅是指一个链接。一旦这个链接被破坏,这个答案就不再有用了
^superclass'