2

最近看到了,现在找不到了。。。

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

--更新:嗯,在法罗!喜欢:

d:=Object new. d setClass: Dictionary.

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

4

4 回答 4

2

#primitiveChangeClassTo:

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

所以你会做

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

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

如果您喜欢元编程,您可能还会对使用任何对象作为类感兴趣。我在Protalk中使用它来实现一种直接在 Smalltalk 之上工作的基于原型的语言。

于 2009-12-11T21:31:29.433 回答
0

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

于 2010-01-22T00:08:02.910 回答
0

#setClass: 方法用于某些特定的上下文和不同的实现(使用方法查找器检查它)。

Object 有一些助手可以将当前对象转换为其他类型,例如#asOrderedCollection,因为这最后允许操作:

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

    ^ OrderedCollection with: self

HTH。

于 2009-12-04T11:56:40.853 回答
0

好的,那么您可以尝试以下操作:

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

d become: e. 

但是,请谨慎尝试#become:,因为在很多情况下它会破坏形象。

于 2009-12-10T21:50:26.900 回答