2009-12-03 101 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。它創建一個新類,當您修改一個類時,然後將前者的實例切換到後者的實例。因此,它應該提供一些方法,你所要求的。

相關問題