在PharoSmalltalk中以编程方式创建和删除类
我正在尝试从存储在 JSON 文件中的外部定义创建类。我可以使用如下消息轻松创建一个类:
name := 'SomeNewClass'
Object subclass: name asSymbol
instanceVariableNames: ''
classVariableNames: ''
package: 'SomeNew-Package'.
第一个工作正常,但是如果我再次运行我的代码,它会失败,因为该类已经存在。我一直在寻找,但我不知道如何检查类是否存在,如果存在则将其删除?
回答
你的代码不应该失败。你看到的问题肯定有不同的原因,让我解释一下原因。
在(每个)Smalltalk 类中可以重新定义以修改它们。通常,您将从以下方面的简单方法开始
Object subclass: #Volcano
instanceVariableNames: ''
classVariableNames: ''
package: 'SomeNew-Package'
添加一些方法和测试,然后意识到您需要一两个实例变量
Object subclass: #Volcano
instanceVariableNames: 'location active'
classVariableNames: ''
package: 'SomeNew-Package'
这样做时,完全相同的类对象Volcano将保持不变,并且您的实例(如果有的话)将获得两个新插槽(一个用于location,另一个用于active)。
更一般地说,重新定义类的能力包括进化模型可能需要的所有操作:
- 添加/删除/重命名实例变量
- 添加/删除/重命名类变量
- 添加/删除/重命名类实例变量
- 更改超类
- 重命名类
- 将类移动到另一个包
这些操作都不会解释该类已经存在且无法重新定义。相反,您可以使用大量基础设施以有意义的方式启用所有这些基础设施,这不仅会重塑您的类,还会重塑其实例和子实例。
因此,您的特定问题需要另一个诊断。告诉我们您遇到了什么“失败”,以便我们更好地了解发生了什么。
微不足道的评论:您的代码片段中缺少一个点来分隔这两个语句。它应该读
name := 'SomeNewClass'. "<- dot added"
Object subclass: name asSymbol
instanceVariableNames: ''
classVariableNames: ''
package: 'SomeNew-Package'. "<- final dot is ok but not required"
顺便说一句,你可以用一个语句来写这个:
Object subclass: #SomeNewClass
instanceVariableNames: ''
classVariableNames: ''
package: 'SomeNew-Package'