在Pharo Smalltalk中以编程方式创建和删除类



我正试图从存储在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'

若要查看是否存在全局(类(,请尝试Smalltalk includesKey: aSymbol。若要删除全局,请尝试Smalltalk removeKey: aSymbol。(注意,可能还有另一种方法可以访问系统字典。上面的代码来自内存,尚未尝试过。(

最新更新