初探設計:Java繼承何時用?怎麼用?
初探設計:Java繼承何時用?怎麼用?
Writer :BYSocket(泥沙磚瓦漿木匠)
一、回顧繼承
常見的如下:
1、依賴(”uses-a“)
2、聚合(”has-a“)
3、繼承(”is-a“)類之間關係
也就是UML類圖中常見的三種關係,另外常見的還有實現(接口與實現類的關係),組合等。
繼承,即“is-a”關係,是一種表示特殊與一般的關係。比如,女人(特殊)是一個人(一般)。關鍵字extends表明正在構造的新類派生於一個存在的類。
1、已經存在的類稱為 超類、父類或者基類。
2、新類被稱為 子類或者派生類。
有時候看著人家源碼的設計。比如常見的接口,緊接著抽象類實現接口,然後繼承該抽象類的各種實現:
一般都是這樣的,行為總則都寫著頂層接口,抽象類實現了下麵各個實現類公用的方法和字段,實現類各自實現功能。
但裏麵這些究竟怎麼用呢?比如繼承在什麼前提下使用,什麼場景前提下,下麵就是思考後的小結:(Think , Write & Do)
二、繼承何時用?怎麼用
也就是說,繼承設計使用的時候,有哪些技巧,有哪些需要注意的地方。
1、公共的方法和字段才放在基類(也就是父類)
這句話可能有爭議,太過於吹毛求茲或者是嚴格。拿女人和人的問題來說,比如名字字段、age都可以放在基類人上麵,但女人的那些第二特征就是獨有了。
但有些時候的例子總是很疑惑:比如Java工程師實習生和Java工程師,看樣子可以“實習生”extends “Java工程師”,然後很多Java工程師上的字段都是不屬於Java實習生的。顧兩者並沒有上麵太大關係,可能都是從屬於一個父類—工程師。下麵類關係圖才是正確的:
子類對父類的繼承是包括了父類的公有和受保護的方法和字段。但子類隻需要繼承父類的一部分,就沒轍了。這時候記住一句話:“多用組合,少用繼承”。
2、protect並不能保護父類
其實protect機製在父類並不能起到好的保護。子類可以在需要的的時候訪問父類。但是繼承無限製,即子類的子類… 無止境的。如果想侵入父類protect方法,隻需要寫個類,繼承任意子類就可訪問。二者,同一個包下能訪問。
從上麵也可以總結出:
3、在繼承父類的方法與字段都有意義的時候,選擇繼承。否則,不要使用繼承。
4、在覆蓋父類中的行為(方法)時,不要偏離最初的設計內涵。
父類的方法實現或者定義都是指定了一種行為的內涵。所以繼承父類的時候,有個重寫(override)方法可以改變子類的行為。但請不要改變其定義的內涵。源碼中常見的有:比如 IO 中的 read write方法和Servlet中 的 get post。
5、繼承與組合、多態
繼承,子類與父類在編譯期就能確定其對象。而組合或者是多態,在運行期就才能確定其對象,相比之下,組合與多態達到了更多的靈活性。但,運行期未知的錯誤是要注意處理的。
顧,“多用組合,少用繼承”。
三、本文小結
繼承的一點一滴。泥瓦匠,這軟文小結,難免有錯誤。歡迎指正討論。
歡迎點擊我的博客及GitHub — 博客提供RSS訂閱哦!
———- https://www.bysocket.com/ ————- https://github.com/JeffLi1993 ———-
微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter :BYSocket
最後更新:2017-05-22 10:02:41