如何将对象的类设置为其他类?

时间:2009-12-03 19:20:48

标签: class metaprogramming smalltalk pharo

我最近见过这个,现在我找不到了......

如何将对象的类设置为其他类?

- 更新:嗯,在Pharo!喜欢:

d:=Object new. d setClass: Dictionary.

只是它实际上不是setClass。如何修改对象的类指针?

4 个答案:

答案 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。当您修改类时,它会创建一个新类,然后将前者的实例切换为后者的实例。因此,它应该提供一些方法,你要求的。