如果你希望多個 class 有相同的 method , 你可以有二種方法來做
- 寫個父類別, 由各個子類別繼承它
- 寫個介面, 由各類別去實作它
如果要拿類別與介面二者來判斷, 一般人都比較沒有問題, 但若是要在 abstract class (抽象類別), interface (介面)二者間做選擇, 要如何下決定呢?
我寫一些原則,您參考一下
>>若一定要寫 class, 那麼何時要加 abstract 呢?
若這 class 你一定不想讓人 new 它,就一定要加,例如若 '動物' class 不想給人 new, 人家一定只能 new 人,狗,那麼動物就可以宣告成抽象類別( abstract class )
>>abstract class 裡是否一定要寫 abstract method ?
不一定, 例如 '動物' class 裡全部只宣告了 '生' , '死' 二個 method, 它們不一定要被宣告成 abstract method (抽象方法)
>>何時要用 interface 而不要使用父類別
盡量用 interface, 盡量不要用父類別, 如果例子簡化成 '動物一定有眼睛, 需要由各子類別去實作', 而 '動物' class 裡也沒別的定義, 那麼就是使用 interface 的標準狀況, 完全不必考慮是否要使用 abstract class
>>何時要用父類別而不要使用 interface
如果父類別有寫一些 method, property ,你想讓子類別能繼承後就順便有它們,就用父類別, 至於父類別要宣告成 class or abstract class, 就回到我一開始講的,端看父類別想不想被 new
>>如果只是因為有一些類別想要有一些method,property,就用父類別好嗎?
例如您寫 Product (產品), Member (會員) class, 若僅僅只是因為它們都需要一個叫 connection 的 property, 或者需要一個
public void Add(string SQL)
的 method, 仍建議不要因為這麼 weak 的理由就貿然使用父類別, 因為您只需要寫一個 db class, 然後在 Product, Member 裡呼叫 db class 即可
有時你在寫程式時需要存取檔案,此時你一定會叫用 File,FileInfo 類別, 但一定也同意不必因此而讓這類別去繼承它,對吧(不然,一個類別豈不是有繼承不完的東西)
在 C#, VB.NET 語言裡, 一個類別只能繼承一個 class, 可以實作多個 interface, 所以換個角度來看, 寫程式時不要這麼 '敗家' , 隨便地就將維一一個繼承的機會就用掉了