繼承是Is-A的關係。曾經看到有人為了復用而使用了繼承:有一個Base類,裡面寫了很多Common的方法,很多類繼承自這個類,這種做飯就是把Has-A用Is-A來實現的。 繼承的概念是說一個類是另一個類的特化。 Liskov替換原則:派生類必須能夠通過基類的介面而被使用,且使用者無需瞭解兩者之間的差 ...
繼承是Is-A的關係。曾經看到有人為了復用而使用了繼承:有一個Base類,裡面寫了很多Common的方法,很多類繼承自這個類,這種做飯就是把Has-A用Is-A來實現的。
繼承的概念是說一個類是另一個類的特化。
Liskov替換原則:派生類必須能夠通過基類的介面而被使用,且使用者無需瞭解兩者之間的差異。該原則感覺下來是為了保證繼承的語義沒有變,這樣便可以控制繼承的複雜度。
針對繼承的一些原則:
- 如果多個類共用數據而非行為,應該創建這些類可以包含的共用對象(Has-A)。
- 如果多個類共用行為而非數據,應該讓它們從共同的基類繼承而來,併在基類中定義共用的子程式,這裡容易迷糊:這樣做的前提是要看是不是Is-A的關係,如果不是,還是不建議使用繼承,而是把這些共用的行為放入公用對象,然後引用這個共用對象。
- 如果多個類既共用數據也共用行為,應該讓它們從一個共同的基類繼承而來,基類中定義共用的數據和子程式
- 當想在基類中控制介面時,使用繼承,當想自己控制介面時,使用包含。
- 避免讓繼承體系過深,不要超過三層,另外子類的數量建議7+—2
- 當大量出現switch、case時,可以考慮使用繼承,使用多態健身case的類型check。