重写 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
应该可以工作
我需要为我创建的新 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
应该可以工作