2013-04-23 68 views
4

在smalltalk中,當我們通過調用new創建一個調用initialize的對象時。我想初始化,但用我自己的參數(在運行時傳遞)。我怎樣才能做到這一點。在smalltalk中新建並初始化 - 如何傳遞參數來初始化

例如Myobjcet new

但我如何將參數傳遞給它,以便它們傳遞給初始化。 我正在使用Pharo。

回答

2

如果我記得,應該避免重新實現類方法newinitialize。相反,您可以創建自己的類方法(除了新的或初始化的),它需要參數,並在創建新實例時使用這些方法。例如在Squeak中查看類別方法with:的類別Collection。它首先創建一個集合實例,然後將作爲參數傳遞的對象添加到實例中。

with: anObject 
    "Answer an instance of me containing anObject." 

    ^self new 
     add: anObject; 
     yourself 

Pharo也許基於佳樂,所以你應該找到相同的,或在您的圖像Collection相似的類方法。

+0

所以這是通過調用類方法來實例化對象的一種很好的方法。我不知道。想知道它是否是一種好的做法。 – j10 2013-04-23 15:57:09

+0

如果您需要在創建對象時初始化新創建的對象,那麼是的,創建您自己的類方法是(我相信)很好的做法。這裏有更多有經驗的Smalltalkers,所以他們最終會在這件事上發表意見。如果他們另有說法,那麼我會相信他們對我的看法。 :) – 2013-04-23 15:59:48

+0

感謝您的建議。 – j10 2013-04-23 16:23:21

5

正確編寫複雜對象層次結構的實例化和初始化代碼在Smalltalk中很棘手。更重要的是,Object中實現的默認初始化邏輯在不同的Smalltalk方言中是不同的(即Pharo決定引入默認初始化器,使事情變得更糟)。

爲了避免混亂,並有明確的,一致的規則海邊團隊決定採用以下規則對他們所有代碼:

http://code.google.com/p/seaside/wiki/ObjectInitialization

而且海邊代碼包含您在錯誤代碼評論家規則使用建議的初始化模式。

+0

在閱讀完這些之後,我認爲這或多或少是我多年來爲自己提出的規則,主要是通過反覆試驗(也就是打我的腳)。我已預訂標記以供將來參考。 – 2013-04-23 18:01:48