重写 squeak 中的子类方法

Overriding subclass method in squeak

我需要为我创建的新 classs 创建一个新的 subclass 方法,它有 2 个 class 实例变量:isInterface 和 behavesLike。 我需要制作一个 subclass 方法来获取此参数,并使用这些参数创建一个新的 subclass 。 我只是不知道我在这里做错了什么。 这是我的代码:

subclass: aSubclassName isInterface: isInterface behavesLike:
    aCollection instanceVariableNames: instVarNames classVariableNames:
    classVarNames poolDictionaries: poolDictionaries category:aCategoryName
|m|
    m:=(super subclass: aSubclassName
        instanceVariableNames: instVarNames
        classVariableNames:classVarNames
        poolDictionaries: poolDictionaries
        category: aCategoryName).
(m class) instVarNamed:'behavesLike' put:aCollection;instVarNamed:'isInterface' put:isInterface
            ^(m class).

我一直收到这些错误:

您正在混合使用 class 和实例级别,这是一个非常常见的问题。

类 是创建实例的工件。而 instVars 正是在实例中。 在你的情况下,

(m class) instVarNamed:'behavesLike' put:aCollection

试图设置一个 class 的实例变量,因为 m class 是一个 class。如果你想要一个实例,你应该和 mclass new 说话,但更糟糕的是,因为 m 本身是一个 class,所以 mclass 是一个 metaclass。要理解所有这些混淆,您应该阅读 Blue Book 中有关 Metaclasses 的章节。 但是要修复您的代码,m new 而不是 m class 应该可以工作