我最近见过这个,现在我找不到了......
如何将对象的类设置为其他类?
- 更新:嗯,在Pharo!喜欢:
d:=Object new. d setClass: Dictionary.
只是它实际上不是setClass。如何修改对象的类指针?
答案 0 :(得分:2)
有#primitiveChangeClassTo:
。
它要求原始类和目标类具有相同的类布局。由于某些奇怪的原因,它期望目标类的实例作为参数,但是不使用它。
所以你会这样做
d := Object new.
d primitiveChangeClassTo: Dictionary new.
但是这会失败,因为字典有两个实例变量但普通对象没有。
如果您正在进行元编程,您可能也会将任何对象用作类。我在Protalk中使用它来实现基于原型的语言,该语言直接在Smalltalk之上工作。
答案 1 :(得分:0)
方法#setClass:用于某些特定的上下文和不同的实现(使用Method Finder检查)。
Object有一些助手可以将当前对象转换为其他类型的对象,例如#asOrderedCollection,因为这最后允许操作:
asOrderedCollection
"Answer an OrderedCollection with the receiver as its only element."
^ OrderedCollection with: self
HTH。
答案 2 :(得分:0)
好的,那么你可以尝试一下:
d := Object new.
e := Dictionary new.
d become: e.
但是,请尝试#become:谨慎,因为在很多情况下它会破坏图像。
答案 3 :(得分:0)
看一下Class ClassBuilder。当您修改类时,它会创建一个新类,然后将前者的实例切换为后者的实例。因此,它应该提供一些方法,你要求的。