我最近看到過這個,現在我找不到它...如何將對象的類設置爲其他內容?
你如何設置對象的類到別的東西?
- 更新:那麼,在Pharo!像:
d:=Object new. d setClass: Dictionary.
只有它不是實際setClass。你如何修改對象的類指針?
我最近看到過這個,現在我找不到它...如何將對象的類設置爲其他內容?
你如何設置對象的類到別的東西?
- 更新:那麼,在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