(www.free56.cn, Based from ‘CLR via C#’)
Base class 和 Interface的使用,有時很容易判斷,有時又很難區分。
1)二者的主要區別:Base class 體現了“IS A”的關係,而Interface體現的是“CAN DO”的關係。因為C#不允許多重繼承(Multi-inherit),所以,如果派生的類不能正確的反映IS-A的關係,就不要使用基類;而如果不同的類或對象(Type)包含了同樣的CAN-DO的功能,那麼就用介面。另外,實值型別(Value type)只能使用介面,不能使用Base Class;
2)相比Interface,使用Base Class的有點:
i)使用方便(Easy of use):基類提供了大量現成的方法、功能,子類可以直接使用;而使用介面時,必須定義介面規定的所以的成員;
ii)執行穩定(consistent implementation): 不管關於介面的文檔的描述有多麼完善,其他人(第三方)在根據介面完善類時,也都會遇到很多問題,不可能做到100%的準確,這樣就導致了bug的產生,而使用基類方式,定義一個可以正確執行的基類,而在衍生類別中適當的修改已達到最終需求,無疑會使程式更加穩定,出問題的幾率更小;
iii)擴充(Versioning):如果給基類增加新的方法(method),那麼,繼承的子類可能無需編譯即可使用基類中新增加這些方法;而使用介面的話,就不這麼容易了,介面中增加新的聲明後,必須在子類中去實現(implement)這些新增的方法。
3)使用interface的一些情況:對於那些提供的相對穩定(consistent)的操作的類,最好給它們定義一個統一的interface。 如,你的類中都有彙總對象(列表),都能夠增加、插入、刪除某一列表中的項目,那麼,我們就可以讓他們都繼承與IList<T>介面,此時,你就可以對你的那些類進行增加、插入、刪除等操作,而無需知道他們的具體類,因為你知道他們都實現了IList<T>介面的方法。
4)當然,有時定義介面和使用類繼承效果沒什麼區別,如實現Compare功能,FLC提供了ICompareer<T>和Comparer<T>的抽象類別供繼承。看你的習慣了:)