像C++這類語言都支持多重繼承,一個子類可以有多個父類,這樣的設計常被人詬病。因為繼承應該是個”is-a”關系。比如轎車類繼承交通工具類,因為轎車是一個(“is-a”)交通工具。一個物品不可能是多種不同的東西,因此就不應該存在多重繼承。
不過有沒有這種情況,一個類的確是需要繼承多個類呢?
答案是有,我們還是拿交通工具來舉例子,民航飛機是一種交通工具,對于土豪們來說直升機也是一種交通工具。對于這兩種交通工具,它們都有一個功能是飛行,但是轎車沒有。所以,我們不可能將飛行功能寫在交通工具這個父類中。
但是如果民航飛機和直升機都各自寫自己的飛行方法,又違背了代碼盡可能重用的原則(如果以后飛行工具越來越多,那會出現許多重復代碼)。怎么辦,那就只好讓這兩種飛機同時繼承交通工具以及飛行器兩個父類,這樣就出現了多重繼承。
這時又違背了繼承必須是”is-a”關系。這個難題該怎么破?
不同的語言給出了不同的方法,讓我們先來看下Java。Java提供了接口interface功能,來實現多重繼承:
publicabstractclassVehicle{
}
publicinterfaceFlyable{
publicvoidfly();
}
publicclassFlyableImplimplementsFlyable{
publicvoidfly(){
System.out.println("Iamflying");
}
}
現在我們的飛機同時具有了交通工具及飛行器兩種屬性,而且我們不需要重寫飛行器中的飛行方法,同時我們沒有破壞單一繼承的原則。飛機就是一種交通工具,可飛行的能力是是飛機的屬性,通過繼承接口來獲取。
publicclassAirplaneextendsVehicleimplementsFlyable{
privateflyable;
publicAirplane(){
flyable=newFlyableImpl();
}
publicvoidfly(){
flyable.fly();
}
}
回到主題,Python語言可沒有接口功能,但是它可以多重繼承。那Python是不是就該用多重繼承來實現呢?是,也不是。
說是,因為從語法上看,的確是通過多重繼承實現的。說不是,因為它的繼承依然遵守”is-a”關系,從含義上看依然遵循單繼承的原則。這個怎么理解呢?我們還是看例子吧。
classVehicle(object):
pass
classPlaneMixin(object):
deffly(self):
print'Iamflying'
classAirplane(Vehicle,PlaneMixin):
pass
可以看到,上面的Airplane
類實現了多繼承,不過它繼承的第二個類我們起名為PlaneMixin
,而不是Plane
,這個并不影響功能,但是會告訴后來讀代碼的人,這個類是一個Mixin類。
所以從含義上理解,Airplane只是一個Vehicle
,不是一個Plane。這個Mixin
,表示混入(mix-in),它告訴別人,這個類是作為功能添加到子類中,而不是作為父類,它的作用同Java中的接口。
使用Mixin類實現多重繼承要非常小心
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注本站行業資訊頻道,感謝您對本站的支持。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
永隆銀行內地開戶條件是什么?永隆銀行內地開戶條件:年滿18周歲,具有完全民事行為能力的中國公民。如果消費者想要在永隆銀行開戶,需要提供有效身份證、居住地址證明文件。消費者可以在永隆銀行APP中點擊“我要開戶”,或者 是在招商永隆銀行官網中填寫在線申請表。招商永隆銀行官網開戶操作如下:一、在招商永隆銀行中找到預約開戶并點擊,消費者可以根據實際情況選擇香港本地分行開戶,或填寫申...
(資料圖)隨著社會越來越發達,大家都選擇在網絡上汲取相關知識內容,比如怎么查電信寬帶到期時間,為了更好的解答大家的問題,小編也是翻閱整理了相應內容,下面就一起來看一下吧!電信寬帶到期時間查詢方法:1、首先撥打電信客服10000;2、然后根據語音提示選擇“人工服務”;3、向電信客服提供用戶所要查詢的寬帶賬號,有時候可能會讓用戶提供有效證件信息或需要用戶使用綁定寬帶的電話撥打10000;4、登陸電信官...
【資料圖】【大河財立方 見習記者 王寧寧】4月18日,大河財立方記者獲悉,2023全球豫商大會將于4月21日至22日在鄭州與癸卯年黃帝故里拜祖大典同期舉辦。其中,4月21日下午主活動將安排頒獎、項目簽約等議程,22日下午舉辦平頂山專場推介會、粵港澳大灣區投資交流懇談會等活動。本屆大會由省委、省政府主辦,省委統戰部、省政協辦公廳、省商務廳、省工商聯、省僑聯、省豫商聯合會、鄭州市人民政府共同承辦,大會...