正在作一個項目,根據以往看一些java和框架源碼的印象,模仿着寫了一些基礎類的繼承結構,用着挺順,今早上班步行的空餘時間,回想了下,發現這種結構還算比較不錯,想不通爲何大學上課好像老師沒提過....java
之前上課常說面向接口編程,講得很抽象很膚淺,很長一段時間都覺得一切都應該向藉口看齊,而忽略了抽象類。邏輯上來講,實現類跟接口是has a的關係,跟抽象類是is a的關係,實際上二者的功能也差很少,很容易在寫基礎類的時候,不知道該選擇接口仍是抽象類,到如今我仍是憑直覺去瞎搞的。以前看度娘說,使用接口編程能使程序代碼更靈活,更強壯,但缺點是接口的擴展性受到抑制,緣由是這樣的:編程
假設接口定義以下:框架
1 public interface Interface { 2 void toDo(); 3 void toEat(); 4 void toSleep(); 5 }
繼承關係以下:性能
此時出現一個問題,若是由於一些緣由,接口Interface的方法須要增長一個toShit(),那麼後續實現的全部類Class/ClassA/ClassB/ClassC/ClassD/ClassE/ClassF/……所有都須要進行修改,由於必需實現接口的全部方法。spa
若是改變一下,在接口後面直接接一個抽象空實現類(或者不抽象的),提供接口全部方法的一個空實現,全部子類均繼承實現此類:設計
那麼當接口須要增長方法時,僅須要更改BasicClass,增長一個空實現,後續子類徹底不需變更代碼。這樣子接口的擴展性能獲得一點改善,對初期沒把握將接口設計完善的時段應該挺有用。code