【问题标题】:Smalltalk superclass vs metaclass?Smalltalk 超类与元类?
【发布时间】:2011-01-08 23:10:29
【问题描述】:

我是 OOP 新手,但具有“程序”背景。

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

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

【问题讨论】:

    标签: smalltalk metaclass superclass


    【解决方案1】:

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

    【讨论】:

    • 感谢您的链接!似乎是我要找的。​​span>
    • 你应该包括回答这个问题的书的要点,而不是仅仅引用一个链接。一旦该链接断开,此答案将不再有用
    【解决方案2】:

    实际上有两个层次的继承:实例继承和类继承。

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

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

    【讨论】:

    • @zneak -> "元类"简单地"是类对象的类。"我认为超类是“类对象的类”。这真的是我的问题 - 超类和元类之间有什么区别?
    • "实际上有两个层次的继承:实例继承和类继承。"从这个公式中,我猜你混淆了继承和实例化......
    • 这正是我的意思。子类可以覆盖我们在其他语言中所说的静态方法。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      ^superclass'
      

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

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

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

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

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

      (通常在这个阶段我的大脑开始从我的耳朵流血,但以下 3 点有助于将它全部推回我的头骨)

      如果你发送消息anInstanceOfAClass class - 你会得到
      返回的对象 anInstanceOfAClass 的类。

      如果你发送消息anInstanceOfAClass class superclass - 你会得到
      返回的对象 anInstanceOfAClass 的类的父类。

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

      【讨论】:

        猜你喜欢
        • 2019-11-04
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 2012-05-16
        • 2011-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多