在squeak中覆盖子类方法

问题描述 投票:1回答:1

我需要为我创建的有两个类实例变量的新类创建一个新的子类方法: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).

我只是继续得到这些错误:

smalltalk squeak
1个回答
1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.