如何将对象的类设置为其他内容?
我最近看到过这个,现在我找不到它...如何将对象的类设置为其他内容?
你如何设置对象的类到别的东西?
- 更新:那么,在Pharo!像:
d:=Object new. d setClass: Dictionary.
只有它不是实际setClass。你如何修改对象的类指针?
方法#setClass:用于某些特定的上下文和不同的实现(使用Method Finder进行检查)。
对象有一些助手CONVER当前对象的其他种类的,例如#asOrderedCollection,因为这最后的许可证操作:
asOrderedCollection
"Answer an OrderedCollection with the receiver as its only element."
^OrderedCollection with: self
HTH。
这一切都很有帮助,但我真的想改变我的对象的类指针。假设其他类具有相同的布局(相同的inst变量,不可索引),这应该是可能的,不应该吗? – Jack 2009-12-04 14:07:34
OK,那么你可以尝试的东西如:
d := Object new.
e := Dictionary new.
d become: e.
但是,请尝试#become:谨慎,因为在很多情况下,它打破了图像。
成为:很酷/奇怪/有趣。但它没有做OP所要求的。 – 2012-12-09 14:38:57
还有#primitiveChangeClassTo:
。
它要求原始类和目标类都具有相同的类布局。出于某种奇怪的原因,它期望目标类的实例作为参数,但是不使用。
所以,你会做
d := Object new.
d primitiveChangeClassTo: Dictionary new.
但是失败了,因为字典有两个实例变量,但普通的对象没有。
如果您正在进行元编程,您可能还会使用任何对象作为一个类。我在Protalk中使用它来实现基于原型的语言,该语言直接在Smalltalk上运行。
请看Class ClassBuilder。它创建一个新类,当您修改一个类时,然后将前者的实例切换到后者的实例。因此,它应该提供一些方法,你所要求的。
呃......你能详细说一下_slightly_更多吗? – Macke 2009-12-03 20:29:09