上節課我們具體地講述了繼承的機制,並且也設計了一個繼承樹,那麼問題來了:我不是要問挖掘機技術哪家強?我是要問如何來確定一個類是另一個類的子類呢?我們又如何設計一個類而不是某個類中的屬性呢?
“是一個”與“有一個”
這裡我們就要用這麼一個方法來檢驗它們二者之間的關係了:
我們說,手槍是槍械——OK,沒有問題,那麼手槍這個類就是槍械的子類。
還有長劍是一把劍,是一個冷兵器——沒問題,那這樣一個順序的繼承樹就出來了。
或者……手機是一個顯示器? ——好吧,手機有一個顯示器或許會更恰當一些,那麼顯示器就是手機的一個屬性了。
顯示器有二極管——OK,二極管就是顯示器的屬性。
我們靠這樣的一種思考方法,能夠快速甄別繼承樹的設計是否符合邏輯。
對了
這個測試的方法還不僅關乎與二者之間,一個繼承樹最底端類應該也能對最頂端的類有“是一個”這樣的關係——比如“手槍是武器”這樣,如果不行,那你的繼承樹設計恐怕就有了問題。
順序問題
我們一直在說繼承樹,所以說這是一個樹狀的拓撲,子類一定擁有父類,但父類可不一定就擁有子類——所以說父類並不能知道子類的方法,相反,在子類裡我們可以使用 super 這個關鍵字來調用父類裡的方法,比如我要擴充一下槍械的攻擊方法,就可以這樣來做:
1 2 3 4 5 6 7 |
class RPG:枪械 { override func 攻击() { //攻击前的特殊准备 super.攻击() //攻击后的特殊动作 } } |
我的日記本呢?
還記得我們說過日記本和 private 的比喻嗎?標記為私有的方法和屬性是不能被別人讀取的!你的孩子在未經你許可的情況下也一樣不能偷看你的日記!
所以我們說子類繼承了父類所有成員的時候,其實是不包括私有方法和屬性的!這些成員只在本類裡可見喲~
本文由 落格博客 原創撰寫:落格博客 » 到底怎麼辦:“是一個”與“有一個”
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/1120.html
註釋