如果你能開4門通勤車,你也可以開皮卡。如果你開的是內燃機車,你也可以開電動車。
乘用車的形狀和大小各不相同。執行這些車輛的發動機也可能完全不同。但這對司機來說並不重要。
你只要上車,繫好安全帶,啟動汽車,掛上擋,然後開車。這是因為汽車、卡車和麵包車都是多型的。
讓我們看看多型這個詞。你可以把它分解成多邊形,變形和變形。
多邊形意味著很多,就像多邊形意味著很多角度。當用作名詞時,變體是一個物種的變體。i**可以指系統。
所以多型性僅僅意味著一個由許多變體組成的系統。不過,這仍然不能告訴你它是如何在程式設計中使用的。那是下一個。
在程式碼中建立從另一個類繼承的類時,就是將新類繫結到協定。合同規定父級中的每個變數和函式也將在子級中。
每輛車都有方向盤、油門、剎車踏板和轉向燈。開車不需要開啟引擎蓋。重要的是它是一輛車。
這同樣適用於從其他類繼承的類。下面是TypeScript中的一個示例:
class Vehicle { private _engine: string; private _tires: number; c***tructor(engine: string = "combustion", tires: number = 4) { this._engine = engine; this._tires = tires; } accelerate(velocity: number) { c***ole.log("accelerating at a velocity of " + velocity); } brake(pressure: number) { c***ole.log("applying " + pressure + " pressure"); } turnLeft() { c***ole.log("turning left"); } turnRight() { c***ole.log("turning right"); }}class Car extends Vehicle {}class Tesla extends Car { c***tructor() { super("electric"); }}在本例中,有一個Vehicle類。Car類繼承自Vehicle類。特斯拉繼承了汽車。現在讓我們建立兩個物件並檢視它們。
let myCoupe: Car = new Vehicle();c***ole.log(myCoupe);c***ole.log(myCoupe.c***tructor.name);let mySedan: Vehicle = new Tesla(); c***ole.log(mySedan);c***ole.log(mySedan.c***tructor.name);myCoupe.turnLeft();mySedan.turnLeft();你可以看到,我們宣佈myCoupe是一輛汽車,mySedan是一輛汽車。然後我們將myCoupe例項化為一個新的載體,mySedan例項化為一個新的Tesla。如果您訪問TypeScript沙盒並執行程式碼,您將看到它可以正常工作。根據合同,它的行為和你預期的一樣。
換句話說,所有車輛都可以左轉,因為它們從車輛類繼承了左轉。編輯者知道每一輛車的孩子都同意這個合同。所以它假設一切正常,不管物件被型別化或例項化為什麼類。
這有時被稱為“duck typing”,編譯器假設如果它像鴨子一樣走路,像鴨子一樣說話,那麼它也可能是鴨子。因此編譯器不必擔心細節,只需像鴨子一樣對待物件。
多型契約的另一個優點是可以保證程式碼正常工作。如果您已經強型別化了所有變數以及每個函式返回的內容,那麼您就知道每個子級都將始終匹配變數、函式和型別。
這意味著您可以在不破壞程式的情況下新增和更改類中的程式碼。每一個引用車輛物件的物件都會得到滿足期望的資料和功能,無論車輛發生了多少變化。
函式中的程式碼可能無法輸出正確的結果。但這是另一種問題。只要函式遵循約定並返回預期型別的變數,就不會導致程式碼中斷錯誤。
多型性是巨大的,這裡還有10條程式設計原則你應該知道。
多型性是一個很難掌握的概念。但是一旦你得到了它,你就在理解面向物件程式設計的真正意義上邁出了一大步。不過,這個概念似乎仍然是理論上的。所以這裡有一個真實的例子來幫助你看到它有多有用。
假設您正在構建一個連線到MySQL資料庫的web應用程式。然後老闆決定切換到PostgreSQL資料庫。這是否意味著您必須重寫所有資料庫呼叫?
不,不是這樣的。如果你的應用程式使用一個DataAccess類,而它的子類實際上在資料中亂放,那麼你就很幸運了。DataAccess類定義應用程式如何與資料互動,而不是如何與資料庫互動。
有MySQLAccess和postgresqlcaccess這樣的子類來完成所有的髒活。但是,如果你的應用程式只有DataAccess物件,你可以交換資料庫而不需要重寫一行應用程式程式碼。
...版本的基因都在人群中保留。 目錄 1. 概述和主要區別 2. 什麼是瞬時多型性 3. 什麼是平衡多型性 4. 瞬時多型性與平衡多型性的相似性 5. 並列比較-表格式的瞬時多型性與平衡多型性 6. 摘要 什麼是瞬時多型性(transient polymorphi**)?...
...疾病相關的基因的先驗知識。 目錄 1. 概述和主要區別 2. 什麼是候選基因 3. 什麼是GWAS 4. 候選基因與GWAS的相似性 5. 並列比較-候選基因與GWAS的表格形式 6. 摘要 什麼是候選基因(candidate gene)? 候選基因方法是研究預先指定的感興...
...段核心苷酸序列的正確順序。 內容1。概述和主要區別2。什麼是基因分型3。什麼是順序4。並列比較-基因分型與序列5。摘要 什麼是基因分型(genotyping)? 基因分型是利用DNA序列和標記物確定個體的遺傳組成,並對其遺傳進行比較...
...。因此,它適用於基因位點。 目錄 1. 概述和主要區別 2. 什麼是穩定選擇 3. 什麼是平衡選擇 4. 穩定選擇與平衡選擇的相似性 5. 並排比較-表格形式的穩定與平衡選擇 6. 摘要 什麼是穩定選擇(stabilizing selection)? 穩定選擇是一種有...
...相結合,以提高精度和精度。 目錄 1. 概述和主要區別 2. 什麼是QTL 3. 什麼是GWAS 4. QTL與GWAS的相似性 5. 並列比較——QTL與GWAS的表格形式 6. 摘要 什麼是qtl(qtl)? QTL代表數量性狀位點。它是與表型性狀相關的DNA區域。一般來說,一...
...具有共同祖先的相似單倍型。 目錄 1. 概述和主要區別 2. 什麼是單倍體 3. 什麼是單倍型 4. 單倍型與單倍型的相似性 5. 並列比較-單倍型與單倍型的表格形式 6. 摘要 什麼是單倍群(haplogroup)? 單倍型群是一組具有共同祖先的相似...
...性片段長度多型性(RFLP)。 目錄 1. 概述和主要區別 2. 什麼是母體DNA檢測 3. 什麼是父系DNA檢測 4. 父母DNA檢測的相似性 5. 並列比較-母親和父親的DNA測試表格形式 6. 摘要 什麼是母體dna檢測(maternal dna testing)? 母親DNA測試是用來確...
...間的距離和分析基因多型性。 目錄 1. 概述和主要區別 2. 什麼是遺傳圖譜 3. 什麼是物理地圖 4. 遺傳圖譜與物理圖譜的相似性 5. 並列比較-基因圖與表格形式的物理圖 6. 摘要 什麼是遺傳圖譜(genetic map)? 遺傳圖譜是以連鎖分析和...
...載之間的區別。 目錄 1. 概述和主要區別 2. 在C中重寫是什麼# 3. 什麼是C語言中的過載# 4. C中重寫和過載的相似性# 5. 並排比較-以表格形式在C中重寫與過載 6.摘要 什麼是在c中重寫#(overriding in c#)? 在OOP中還有一個重要的概念是繼...
...方法使用後期繫結進行繫結。 目錄 1.概述和主要區別 2. 什麼是早期繫結 3. 什麼是延遲繫結 4. 早期和晚期繫結的相似性 5. 並排比較-早期與晚期以表格形式裝訂 6. 摘要 什麼是早期繫結(early binding)? 在早期繫結中,類資訊用於解...