2011-05-02 61 views
2

如果我說得對,那麼抽象類是至少有一個抽象方法的抽象類?Smalltalk-Squeak中的抽象類。它是什麼?

現在,如果它是抽象的,所以我應該無法創建該類的實例?

一樣,說Abst是一個抽象類的名字(因爲它包含一個抽象方法),這樣做:

是非法的,應該彈出一個錯誤/異常? 或問題出現在這裏:

a := Abst class new. 

UPDATE: 至於建議,我已經這不會讓用戶做出一個類的實例下一個方法,但它不工作:

makeAbstract: aClass  
    aClass compile: 'new 
       ^self subclassResponsibility'. 

回答

10

歡迎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'. 
+0

謝謝,所以如果沒有「非法」或「無法」這樣的事情,抽象類之間的連接實際上不是這樣的類的實際連接?例如,如果我有一個類,並且我在運行時添加了一個抽象方法,然後(仍然在運行時),當我嘗試創建該類的一個實例時,我想讓它產生一個錯誤,所以它不會讓我那個例子。應該在哪裏處理? – user550413 2011-05-02 13:39:29

+0

@Sean DeNigris,我試過這樣做,但在撥打新電話時沒有發生錯誤。見上面的更新。 – user550413 2011-05-02 16:41:15

+0

你非常接近。查看我對上面方法主體的編輯(添加「class」)。你的代碼在實例端放置#new。另外,如果您將它放在Class中,則不必傳遞類名稱。 – 2011-05-02 19:05:06

2

在Smalltalk中你可以直接實例化的抽象類。只要你不調用抽象方法就行了。您可能希望在運行時實現缺少的方法。

2

是的,抽象類應該至少有一個抽象方法,但不是,您仍然可以創建該類的實例。

你應該做的是使具體的類繼承自抽象類,你可以創建實例並調用方法。在Smalltalk

抽象方法有一個特定的實現,這使得他們和抽象類:

method 
    self subclassResponsibility 

這也意味着,子類應該重寫此方法,並提供了具體的實現。

如果您發現有關subclassResponsibility的錯誤,您的代碼要麼在抽象類上調用方法,要麼您的子類沒有爲方法提供實現。

+0

我添加了一種方法,用^ self subclassResponsibility覆蓋某些類的新特性,但在嘗試創建該類的實例時仍然沒有發生錯誤(請參閱上面的UPDATE中的代碼)。 – user550413 2011-05-02 17:58:13

1

我建議您閱讀Pharo By Example書。你可以在這裏找到它:http://pharobyexample.org/ 你會發現很多有趣的東西。它是一本免費的開放書籍,您可以下載pdf。他們將不得不重新定義,並不能: 其實你問的第5章,第88頁。

1

(固定)「新阻滯劑」介紹了它的具體子類略有不便解釋利用任何繼承的超類'新的功能。 可以解決這個問題有一個小後衛,檢查它是否真的試圖將實例化的抽象類:

AbstractClass class >> new 
    self == AbstractClass ifTrue:[ 
     ^self abstractClassInstantiationError 
    ]. 
    ^super new 

(注意,這裏身份比較,即使你已經堆疊多個抽象其中工程相互之間的類)

+1

您可以在SUnit中看到與抽象TestCase類似的問題(和解決方案):查找'#isAbstract'的實現者。 – 2012-11-29 13:09:53

相關問題