2009-11-13 59 views
8

我從來沒有使用過Smalltalk,但我已經閱讀了很多內容,它一直對我很感興趣。我已經看到了程序運行的很酷的演示,並且簡單地通過改變程序對象正在使用的類的方法來改變正在運行的程序的行爲。這顯然是強大的東西,我明白這可以如何工作。我似乎無法確定的是當你想添加,刪除或重命名該類的實例變量時,現有的類實例會發生什麼情況。重新定義一個Smalltalk類的實例變量

我無法想象如何能夠改變所有類在正在運行的程序中使用的實例變量,並且仍然期望該類的現有實例在之後正常工作。也許我添加了一個新的實例變量,我需要進行初始化,並且以前存在的方法已被更改爲取決於此變量。我不能以任何具有該類實例的運行代碼的可怕故障結束嗎?或者如果一個實例變量的含義發生了變化,我現在預計會有一種不同類型的對象被存儲在那裏比以前更多?是否有某種「升級」機制?或者通常的做法是讓以前的實例崩潰並燒燬?或者這僅僅是「我們在運行程序時不會這麼做,並期望它們能夠存活下去?」

我能想到的唯一合理乾淨的方法是,當您更改實例變量定義時,它實際上可能會創建一個全新的類,並且在更改之前舊實例繼續在舊的類定義中正常工作(由於名稱被重新定義爲新的類定義,現在名稱不可訪問)。也許這是最合乎邏輯的解釋 - 但是由於我沒有找到任何直接解釋這個過程的東西,我想我會在這裏問一下,看看有什麼樣的有趣信息可以幫助我。 :)

回答

7

this paper,它是像你說:

它還可以自動管理類重新定義,保證系統的一致性在對象結構方面和防止名稱衝突,尤其是實例變量名稱衝突。當一個類定義改變時,現有的實例必須進行結構修改,以匹配它們新類的定義。 ClassBuilder不是修改現有對象,而是使用正確的結構(即從替換舊結構的新類)創建一個新結構。然後它用舊的值填充這個新的對象。 ClassBuilder使用become:primitive(參見2.1.1)繼續進行結構修改,在整個系統中用舊的對象替換舊對象。

+0

太棒了!感謝那個鏈接。我不知道爲什麼我的Googlefu不夠強大,無法找到答案。在發佈這個問題之前,我嘗試了很長時間!我一定錯過了一個重要的關鍵字。 :P – Sean 2009-11-13 13:53:14