歡迎Smalltalk的! Smalltalk最重要的一點是它信任開發人員,他們從信任的力量中受益。所以像「無法」和「非法」這樣的詞很少適用。
與大多數其他事情一樣,Smalltalk中的抽象類更像是一個建議/指針,而不是一個嚴格的法則。您尋找的兩個線索是#subclassResponsibility和#shouldNotImplement。這兩種方法是子類的線索,無論是否包含特定的方法。檢查圖片中的示例(始終是問題的出發點)。
由於「抽象」,如上所述,是真的在每一方法的基礎,你的例子就不會產生錯誤(除非#subclassResponsibility或#shouldNotImplement從初始化稱爲
兩件小事:
- 類名都是大寫的 Smalltalk的,所以分區:Abst,不ABST。
- 谷歌搜索很長的路要走。三 出來 「Smalltalk的抽象類的」四大環節都 你需要(this one特別看正確)。
UPDATE:如果你想發信號給你的班級,他們不應該創建實例(如在下面的評論)的用戶,你可以寫:
Abstract>>new
^self subclassResponsibility.
那麼「抽象新建」 - >錯誤,但「AbstractSubclass new」沒問題。
雖然仍然不能保證AbstractSubclass已經重寫了抽象方法(不是#new,但是導致您想要首先阻止實例化的方法),但實際上這不會成爲問題。如果你真的需要,你可以在#initialize中加上一個檢查,確保實例的方法都沒有調用#subclassResponsibility,但除非你有充足的理由,否則不要打擾。
更新2:你的實用方法,使抽象的類是:
Class>>makeAbstract
self class compile: 'new
^self subclassResponsibility'.
謝謝,所以如果沒有「非法」或「無法」這樣的事情,抽象類之間的連接實際上不是這樣的類的實際連接?例如,如果我有一個類,並且我在運行時添加了一個抽象方法,然後(仍然在運行時),當我嘗試創建該類的一個實例時,我想讓它產生一個錯誤,所以它不會讓我那個例子。應該在哪裏處理? – user550413 2011-05-02 13:39:29
@Sean DeNigris,我試過這樣做,但在撥打新電話時沒有發生錯誤。見上面的更新。 – user550413 2011-05-02 16:41:15
你非常接近。查看我對上面方法主體的編輯(添加「class」)。你的代碼在實例端放置#new。另外,如果您將它放在Class中,則不必傳遞類名稱。 – 2011-05-02 19:05:06