什麼是多型性?為什麼值得學習

多型性是程式設計師武器庫中一個強大的工具。下面是它的工作原理和使用方法。...

如果你能開4門通勤車,你也可以開皮卡。如果你開的是內燃機車,你也可以開電動車。

a birds eye view of a collection of swimming pools

乘用車的形狀和大小各不相同。執行這些車輛的發動機也可能完全不同。但這對司機來說並不重要。

你只要上車,繫好安全帶,啟動汽車,掛上擋,然後開車。這是因為汽車、卡車和麵包車都是多型的。

多型性:分解

讓我們看看多型這個詞。你可以把它分解成多邊形,變形和變形。

多邊形意味著很多,就像多邊形意味著很多角度。當用作名詞時,變體是一個物種的變體。i**可以指系統。

所以多型性僅僅意味著一個由許多變體組成的系統。不過,這仍然不能告訴你它是如何在程式設計中使用的。那是下一個。

如果它像鴨子一樣走路。。。為什麼多型物件很棒

a collection of baby ducks

在程式碼中建立從另一個類繼承的類時,就是將新類繫結到協定。合同規定父級中的每個變數和函式也將在子級中。

每輛車都有方向盤、油門、剎車踏板和轉向燈。開車不需要開啟引擎蓋。重要的是它是一輛車。

這同樣適用於從其他類繼承的類。下面是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條程式設計原則你應該知道。

練習多型性

a bird's eye view of a jetski making a U-turn in very blue water

  • 使用上面的沙盒連結建立一個Boat類。
  • 例項化一個新的boat物件,使其成為一個Vehicle型別,但仍然看起來像一個boat。
  • 確保船仍像車輛一樣執行。

多型性的最後一個例子

多型性是一個很難掌握的概念。但是一旦你得到了它,你就在理解面向物件程式設計的真正意義上邁出了一大步。不過,這個概念似乎仍然是理論上的。所以這裡有一個真實的例子來幫助你看到它有多有用。

假設您正在構建一個連線到MySQL資料庫的web應用程式。然後老闆決定切換到PostgreSQL資料庫。這是否意味著您必須重寫所有資料庫呼叫?

不,不是這樣的。如果你的應用程式使用一個DataAccess類,而它的子類實際上在資料中亂放,那麼你就很幸運了。DataAccess類定義應用程式如何與資料互動,而不是如何與資料庫互動。

有MySQLAccess和postgresqlcaccess這樣的子類來完成所有的髒活。但是,如果你的應用程式只有DataAccess物件,你可以交換資料庫而不需要重寫一行應用程式程式碼。

  • 發表於 2021-03-30 04:32
  • 閱讀 ( 84 )
  • 分類:程式設計

你可能感興趣的文章

瞬變(transient)和平衡多型性(balanced polymorphism)的區別

...版本的基因都在人群中保留。 目錄 1. 概述和主要區別 2. 什麼是瞬時多型性 3. 什麼是平衡多型性 4. 瞬時多型性與平衡多型性的相似性 5. 並列比較-表格式的瞬時多型性與平衡多型性 6. 摘要 什麼是瞬時多型性(transient polymorphi**)?...

  • 發佈於 2020-09-21 23:59
  • 閲讀 ( 54 )

候選基因(candidate gene)和gwas公司(gwas)的區別

...疾病相關的基因的先驗知識。 目錄 1. 概述和主要區別 2. 什麼是候選基因 3. 什麼是GWAS 4. 候選基因與GWAS的相似性 5. 並列比較-候選基因與GWAS的表格形式 6. 摘要 什麼是候選基因(candidate gene)? 候選基因方法是研究預先指定的感興...

  • 發佈於 2020-09-26 04:00
  • 閲讀 ( 67 )

基因分型(genotyping)和排序(sequencing)的區別

...段核心苷酸序列的正確順序。 內容1。概述和主要區別2。什麼是基因分型3。什麼是順序4。並列比較-基因分型與序列5。摘要 什麼是基因分型(genotyping)? 基因分型是利用DNA序列和標記物確定個體的遺傳組成,並對其遺傳進行比較...

  • 發佈於 2020-10-07 06:58
  • 閲讀 ( 51 )

穩定(stabilizing)和平衡選擇(balancing selection)的區別

...。因此,它適用於基因位點。 目錄 1. 概述和主要區別 2. 什麼是穩定選擇 3. 什麼是平衡選擇 4. 穩定選擇與平衡選擇的相似性 5. 並排比較-表格形式的穩定與平衡選擇 6. 摘要 什麼是穩定選擇(stabilizing selection)? 穩定選擇是一種有...

  • 發佈於 2020-10-08 14:51
  • 閲讀 ( 47 )

qtl(qtl)和gwas公司(gwas)的區別

...相結合,以提高精度和精度。 目錄 1. 概述和主要區別 2. 什麼是QTL 3. 什麼是GWAS 4. QTL與GWAS的相似性 5. 並列比較——QTL與GWAS的表格形式 6. 摘要 什麼是qtl(qtl)? QTL代表數量性狀位點。它是與表型性狀相關的DNA區域。一般來說,一...

  • 發佈於 2020-10-16 02:35
  • 閲讀 ( 47 )

單倍群(haplogroup)和單倍型(haplotype)的區別

...具有共同祖先的相似單倍型。 目錄 1. 概述和主要區別 2. 什麼是單倍體 3. 什麼是單倍型 4. 單倍型與單倍型的相似性 5. 並列比較-單倍型與單倍型的表格形式 6. 摘要 什麼是單倍群(haplogroup)? 單倍型群是一組具有共同祖先的相似...

  • 發佈於 2020-10-16 06:13
  • 閲讀 ( 45 )

母親(maternal)和父系dna檢測(paternal dna testing)的區別

...性片段長度多型性(RFLP)。 目錄 1. 概述和主要區別 2. 什麼是母體DNA檢測 3. 什麼是父系DNA檢測 4. 父母DNA檢測的相似性 5. 並列比較-母親和父親的DNA測試表格形式 6. 摘要 什麼是母體dna檢測(maternal dna testing)? 母親DNA測試是用來確...

  • 發佈於 2020-10-17 05:12
  • 閲讀 ( 50 )

遺傳圖譜(genetic map)和物理地圖(physical map)的區別

...間的距離和分析基因多型性。 目錄 1. 概述和主要區別 2. 什麼是遺傳圖譜 3. 什麼是物理地圖 4. 遺傳圖譜與物理圖譜的相似性 5. 並列比較-基因圖與表格形式的物理圖 6. 摘要 什麼是遺傳圖譜(genetic map)? 遺傳圖譜是以連鎖分析和...

  • 發佈於 2020-10-18 10:52
  • 閲讀 ( 67 )

壓倒一切(overriding)和c中的過載#(overloading in c#)的區別

...載之間的區別。 目錄 1. 概述和主要區別 2. 在C中重寫是什麼# 3. 什麼是C語言中的過載# 4. C中重寫和過載的相似性# 5. 並排比較-以表格形式在C中重寫與過載 6.摘要 什麼是在c中重寫#(overriding in c#)? 在OOP中還有一個重要的概念是繼...

  • 發佈於 2020-10-18 23:50
  • 閲讀 ( 50 )

早期的(early)和後期裝訂(late binding)的區別

...方法使用後期繫結進行繫結。 目錄 1.概述和主要區別 2. 什麼是早期繫結 3. 什麼是延遲繫結 4. 早期和晚期繫結的相似性 5. 並排比較-早期與晚期以表格形式裝訂 6. 摘要 什麼是早期繫結(early binding)? 在早期繫結中,類資訊用於解...

  • 發佈於 2020-10-19 04:05
  • 閲讀 ( 51 )
sw87703
sw87703

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦