在吱吱声

时间:2017-12-19 16:21:34

标签: smalltalk squeak

我需要为我创建的有两个类实例变量的新类创建一个新的子类方法:isInterface和behavesLike。 我需要创建一个子类方法来获取这些参数,并创建一个带有thos参数的新子类。 我不知道我在这里做错了什么。 这是我的代码:

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).

我只是不断收到这些错误:

1 个答案:

答案 0 :(得分:1)

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

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

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

尝试设置类的实例var,因为m类是一个类。如果你想要一个实例,你应该和m class new交谈,但更糟糕的是,因为m本身就是一个类,所以m类是一个元类。要理解所有这些混淆,您应该阅读蓝皮书中关于元类的章节。 但要修复代码,m new代替m class应该可以正常工作