1. 程式人生 > >初探設計:Java繼承何時用?怎麼用?

初探設計:Java繼承何時用?怎麼用?

Writer      :BYSocket(泥沙磚瓦漿木匠)

一、回顧繼承

常見的如下:

1、依賴(”uses-a“)

2、聚合(”has-a“)

3、繼承(”is-a“)類之間關係

也就是UML類圖中常見的三種關係,另外常見的還有實現(介面與實現類的關係),組合等。

繼承,即“is-a”關係,是一種表示特殊與一般的關係。比如,女人(特殊)是一個人(一般)。關鍵字extends表明正在構造的新類派生於一個存在的類。

1、已經存在的類稱為 超類父類或者基類

2、新類被稱為 子類或者派生類

有時候看著人家原始碼的設計。比如常見的介面,緊接著抽象類實現介面,然後繼承該抽象類的各種實現:

image

一般都是這樣的,行為總則

都寫著頂層介面抽象類實現了下面各個實現類公用的方法和欄位實現類各自實現功能

但裡面這些究竟怎麼用呢?比如繼承在什麼前提下使用,什麼場景前提下,下面就是思考後的小結:(Think , Write & Do)

二、繼承何時用?怎麼用

也就是說,繼承設計使用的時候,有哪些技巧,有哪些需要注意的地方。

1、公共的方法和欄位才放在基類(也就是父類)

這句話可能有爭議,太過於吹毛求茲或者是嚴格。拿女人和人的問題來說,比如名字欄位、age都可以放在基類人上面,但女人的那些第二特徵就是獨有了。

但有些時候的例子總是很疑惑:比如Java工程師實習生和Java工程師,看樣子可以“實習生”extends “Java工程師”,然後很多Java工程師上的欄位都是不屬於Java實習生的。顧兩者並沒有上面太大關係,可能都是從屬於一個父類—工程師。下面類關係圖才是正確的:

image

子類對父類的繼承是包括了父類的公有和受保護的方法和欄位。但子類只需要繼承父類的一部分,就沒轍了。這時候記住一句話:“多用組合,少用繼承”。

2、protect並不能保護父類

其實protect機制在父類並不能起到好的保護。子類可以在需要的的時候訪問父類。但是繼承無限制,即子類的子類… 無止境的。如果想侵入父類protect方法,只需要寫個類,繼承任意子類就可訪問。二者,同一個包下能訪問。

從上面也可以總結出:

3、在繼承父類的方法與欄位都有意義的時候,選擇繼承。否則,不要使用繼承。

4、在覆蓋父類中的行為(方法)時,不要偏離最初的設計內涵。

父類的方法實現或者定義都是指定了一種行為的內涵。所以繼承父類的時候,有個重寫

override)方法可以改變子類的行為。但請不要改變其定義的內涵。原始碼中常見的有:比如 IO 中的 read write方法和Servlet中 的 get post。

5、繼承與組合、多型

繼承,子類與父類在編譯期就能確定其物件。而組合或者是多型,在執行期就才能確定其物件,相比之下,組合多型達到了更多的靈活性。但,執行期未知的錯誤是要注意處理的。

顧,“多用組合,少用繼承”。

三、本文小結

繼承的一點一滴。泥瓦匠,這軟文小結,難免有錯誤。歡迎指正討論。