2011-04-13 74 views
0

您是否知道允許(支持)在運行時更改對象的類的編程語言?在運行時允許更改對象的類別

請給出一個關於語法的簡短例子。給一個用例,如果你知道的話。也歡迎鴨子打字的例子,所以不要回避提及這些語言。

更新:我想到Smalltalk有changeClassTobecome。 CLOS可以做change-class。我發現一篇文章建議使用這些機制來實現在運行時引用的'husk對象',但只有在實際訪問時才從一些持久性構造,從而提供一些漂亮的延遲加載相關對象。

+3

這沒有任何意義。 – SLaks 2011-04-13 14:03:51

+0

我希望沒有。但也許我是老式的。 – 2011-04-13 14:04:33

+0

我注意到,您可以通過更改_metatable_來更改Lua中對象的運行時行爲,並且問自己其他語言是否提供了類似的功能。在Lua中做OO需要在實現和TIMTOWTDI中做一些工作,但是你可以將metatable想象成對象的類(或元類)。 – mkluwe 2011-04-13 16:07:00

回答

0

一段時間後回到案例,我得出結論,如果您覺得需要更改對象類,那麼您需要打字輸入。

1

我認爲,你指的是以下幾點:

你有A類的對象,但你希望把它當作B類的一個對象

有一些結構可能:

  1. 如果B是A的子類,則可以將該對象轉換爲B(但它應該創建爲B,否則您的結果出乎意料(並且希望不需要))。

  2. 在某些語言中,您可以將任何東西投射到任何東西。如果你知道你在做什麼,這是偉大的,否則準備好你的腳上的幾個洞。

你提到了ducktyping。我沒有實際的經驗。但據我所知,鴨子打字就像這樣:「我需要一個支持方法X,Y和Z的對象。」在那種情況下,你不關心課程。你只是想讓它嘎嘎,游泳和按照你的命令行走。

+1

我不認爲他在談論鑄造。 – SLaks 2011-04-13 14:22:19

0
Give a usecase 

???我希望您能夠針對特定用例尋求解決方案。 更改對象的類型?我想不是。」

但是如果你喜歡改變對象的一部分功能或行爲看看鬆散耦合! 例如,您的類擁有File_Saver類型的成員。有一個公共setter接受File_Saver的任何實例,並且您可以注入File_Saver_XML,File_Saver_PDF ...

這並不常見,但類中的任何處理都可以通過1-n鬆散耦合的處理程序完成,您可以交換從外面。

融化到你的問題:你需要一個包裝+一個setter。 :-)