2009-12-03 36 views
2

我最近看到过这个,现在我找不到它...如何将对象的类设置为其他内容?

你如何设置对象的类到别的东西?

- 更新:那么,在Pharo!像:

d:=Object new. d setClass: Dictionary. 

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

+0

呃......你能详细说一下_slightly_更多吗? – Macke 2009-12-03 20:29:09

回答

0

方法#setClass:用于某些特定的上下文和不同的实现(使用Method Finder进行检查)。

对象有一些助手CONVER当前对象的其他种类的,例如#asOrderedCollection,因为这最后的许可证操作:

asOrderedCollection 
    "Answer an OrderedCollection with the receiver as its only element." 

    ^OrderedCollection with: self 

HTH。

+0

这一切都很有帮助,但我真的想改变我的对象的类指针。假设其他类具有相同的布局(相同的inst变量,不可索引),这应该是可能的,不应该吗? – Jack 2009-12-04 14:07:34

0

OK,那么你可以尝试的东西如:

d := Object new. 
e := Dictionary new. 

d become: e. 

但是,请尝试#become:谨慎,因为在很多情况下,它打破了图像。

+0

成为:很酷/奇怪/有趣。但它没有做OP所要求的。 – 2012-12-09 14:38:57

2

还有#primitiveChangeClassTo:

它要求原始类和目标类都具有相同的类布局。出于某种奇怪的原因,它期望目标类的实例作为参数,但是不使用。

所以,你会做

d := Object new. 
d primitiveChangeClassTo: Dictionary new. 

但是失败了,因为字典有两个实例变量,但普通的对象没有。

如果您正在进行元编程,您可能还会使用任何对象作为一个类。我在Protalk中使用它来实现基于原型的语言,该语言直接在Smalltalk上运行。

0

请看Class ClassBuilder。它创建一个新类,当您修改一个类时,然后将前者的实例切换到后者的实例。因此,它应该提供一些方法,你所要求的。

相关问题