簡體   English   中英

重新定義Smalltalk類的實例變量

[英]Redefining instance variables of a Smalltalk class

我從來沒有使用過Smalltalk,但我已經閱讀了很多關於它的內容,它一直引起我的興趣。 我已經看到了程序運行的很酷的演示,只需更改程序對象使用的類的方法就可以改變正在運行的程序的行為。 它顯然是強大的東西,我理解它是如何工作的。 我似乎無法確定的是,當您想要添加,刪除或重命名該類的實例變量時,現有的類實例會發生什么。

我無法想象如何改變所有類在正在運行的程序中使用的實例變量,並且仍然期望該類的現有實例在之后正確運行。 也許我正在添加一個我需要初始化的新實例變量,以及先前已存在的方法已被更改為依賴於此變量的位置。 難道我最終沒有任何運行代碼的可怕故障,該代碼具有該類的實時實例? 或者如果實例變量的含義發生了變化,我現在期望在那里存儲一種不同類型的對象,而不是之前的情況呢? 有某種“升級”機制嗎? 或者通常的做法是讓前面的實例崩潰並燒毀? 或者這只是“我們不會在運行程序時做那種事情並期望它們能夠存活下來的情況”。

我能想到的唯一合理干凈的方法是,當您更改實例變量定義時,它實際上可能會創建一個全新的類,並且在更改之前,舊實例繼續使用舊的類定義(現在是由於名稱被重新定義為新的類定義,因此無法按名稱訪問。 也許這是最合乎邏輯的解釋 - 但由於我沒有找到任何直接解釋這個過程的東西,我想我會問這里,看看有什么樣的有趣信息讓我感到興奮。 :)

根據這篇論文 ,就像你說的那樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM