摘要:優(yōu)先順序模糊多重繼承的優(yōu)先順序,方法調(diào)用順序不明確。在松本行弘的松本行弘的程序世界中介紹了中類(lèi)的幾個(gè)原則通常的繼承用單一繼承第二個(gè)以及兩個(gè)以上的父類(lèi)必須是的抽象類(lèi)中的多重繼承應(yīng)該也適用。
我們前面理解了類(lèi)。類(lèi)就是把具體事物給抽象出來(lái)。其實(shí)也有歸類(lèi)、類(lèi)別的意思。
我們舉一個(gè)例子:
人的職業(yè)有Teacher、Coder、Writer、Singer等職業(yè)
繼承關(guān)系就是:
People ___________|___________ | | | | Teacher Coder Writer Singer
但是有這么一類(lèi)人比較特殊,白天上班碼代碼(Coder),晚上寫(xiě)文章(Writer),我們叫他為CoderWriter。
那么CoderWriter必須是繼承了Coder類(lèi),也繼承了Writer類(lèi)。這就是多繼承。
如果此時(shí)依舊是使用單繼承實(shí)現(xiàn)起來(lái)就會(huì)比較傻(比如在People下再定義一個(gè)CodeWriter類(lèi),繼承Coder類(lèi),然后再把Writer類(lèi)里的代碼復(fù)制過(guò)來(lái))。
但是多重繼承也不是萬(wàn)金油,也會(huì)帶淚諸多問(wèn)題:
結(jié)構(gòu)復(fù)雜化
單繼承中一個(gè)類(lèi)的父類(lèi)是什么,父類(lèi)的父類(lèi)是什么非常明確。多繼承一個(gè)類(lèi)有多個(gè)父類(lèi),父類(lèi)又有多個(gè)父類(lèi),繼承關(guān)系復(fù)雜。
優(yōu)先順序模糊
多重繼承的優(yōu)先順序,方法調(diào)用順序不明確。
功能沖突
當(dāng)父類(lèi)中有相同的方法的時(shí)候,繼承的是哪個(gè)方法不明確。
為了解決上述問(wèn)題,不同的編程方法采用不同的解決方法。
例如java采用只能extends一個(gè)父類(lèi),但是可以實(shí)現(xiàn)多個(gè)interface的方法。
python則采用Mixin的方式。
在松本行弘的《松本行弘的程序世界》中介紹了Ruby中mixin類(lèi)的幾個(gè)原則
通常的繼承用單一繼承
第二個(gè)以及兩個(gè)以上的父類(lèi)必須是Mix-in的抽象類(lèi)
python中的多重繼承應(yīng)該也適用。繼承反應(yīng)的I am,Mixin反應(yīng)的是I can。
我們可以通過(guò)Mixin的方式將某些能力添加給某一些類(lèi)。
回到上面舉例的例子。我們的繼承關(guān)系可以這么來(lái):
People | Writable | | Coder | | |—— Somebody
這樣我們即保持相對(duì)單一的繼承關(guān)系,又能享受多繼承帶來(lái)的好處。
這篇文章僅僅是供自己加深理解使用,可能存在許多錯(cuò)誤。還請(qǐng)諒解。
更多的資料可以閱讀知乎上的回答:https://www.zhihu.com/questio...
或者書(shū)籍《松本行弘的程序世界》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/38313.html
摘要:繼承的優(yōu)缺點(diǎn)推出繼承的初衷是讓新手順利使用只有專(zhuān)家才能設(shè)計(jì)出來(lái)的框架。多重繼承的真實(shí)應(yīng)用多重繼承能發(fā)揮積極作用。即便是單繼承,這個(gè)原則也能提升靈活性,因?yàn)樽宇?lèi)化是一種緊耦合,而且較高的繼承樹(shù)容易倒。 繼承的優(yōu)缺點(diǎn) 推出繼承的初衷是讓新手順利使用只有專(zhuān)家才能設(shè)計(jì)出來(lái)的框架?!狝lan Kay 子類(lèi)化內(nèi)置類(lèi)型很麻煩 (如 list 或 dict)) ,別搞這種 直接子類(lèi)化內(nèi)置類(lèi)型(如 ...
摘要:使用抽象基類(lèi)顯示表示接口如果類(lèi)的作用是定義接口,應(yīng)該將其明確定義為抽象基類(lèi)。此外,抽象基類(lèi)可以作為其他類(lèi)的唯一基類(lèi),混入類(lèi)則決不能作為唯一的基類(lèi),除非這個(gè)混入類(lèi)繼承了另一個(gè)更具體的混入這種做法非常少見(jiàn)。 《流暢的Python》筆記本篇是面向?qū)ο髴T用方法的第五篇,我們將繼續(xù)討論繼承,重點(diǎn)說(shuō)明兩個(gè)方面:繼承內(nèi)置類(lèi)型時(shí)的問(wèn)題以及多重繼承。概念比較多,較為枯燥。 1. 繼承內(nèi)置類(lèi)型 內(nèi)置類(lèi)型...
摘要:飛機(jī)就是一種交通工具,可飛行的能力是是飛機(jī)的屬性,通過(guò)繼承接口來(lái)獲取語(yǔ)言可沒(méi)有接口功能,但是它可以多重繼承。說(shuō)是,因?yàn)閺恼Z(yǔ)法上看,的確是通過(guò)多重繼承實(shí)現(xiàn)的。所以從含義上理解,只是一個(gè),不是一個(gè)。比如飛機(jī)照樣可以載客,就是不能飛了 REST API設(shè)計(jì)理念 showImg(https://segmentfault.com/img/remote/1460000019923606);sho...
摘要:飛機(jī)就是一種交通工具,可飛行的能力是是飛機(jī)的屬性,通過(guò)繼承接口來(lái)獲取語(yǔ)言可沒(méi)有接口功能,但是它可以多重繼承。說(shuō)是,因?yàn)閺恼Z(yǔ)法上看,的確是通過(guò)多重繼承實(shí)現(xiàn)的。所以從含義上理解,只是一個(gè),不是一個(gè)。比如飛機(jī)照樣可以載客,就是不能飛了 REST API設(shè)計(jì)理念 showImg(https://segmentfault.com/img/remote/1460000019923606);sho...
摘要:本章主要是對(duì)上一章類(lèi)的補(bǔ)充。對(duì)于多態(tài)的補(bǔ)充子類(lèi)可以被看成是父類(lèi)的類(lèi)型,但父類(lèi)不能被看成是子類(lèi)的類(lèi)型。仍然以類(lèi)為例,動(dòng)物里有哺乳動(dòng)物,卵生動(dòng)物,有能飛的動(dòng)物和不能飛的動(dòng)物,這是兩種大的分類(lèi)方式。一般在中,以為結(jié)尾類(lèi)的都作為接口。 《Python編程:從入門(mén)到實(shí)踐》筆記。本章主要是對(duì)上一章Python類(lèi)的補(bǔ)充。 1. 從一個(gè)類(lèi)派生出所有類(lèi) 上一篇文章說(shuō)道Python類(lèi)的定義與繼承一般是如下...
閱讀 1905·2021-11-25 09:43
閱讀 1405·2021-11-22 14:56
閱讀 3280·2021-11-22 09:34
閱讀 2010·2021-11-15 11:37
閱讀 2256·2021-09-01 10:46
閱讀 1396·2019-08-30 15:44
閱讀 2294·2019-08-30 13:15
閱讀 2393·2019-08-29 13:07