如何用繼承來組織面向物件的程式碼

正確使用面向物件程式設計意味著您需要了解繼承以及它如何簡化編碼和減少錯誤。...

在面向物件程式設計中重用程式碼是很常見的。類的存在使您可以建立物件,而不必反覆編寫相同的變數和函式。

a family of Japanese macaque bathing in a hot spring

但是班級本身呢?有時課程也很相似。例如,一棵樹有樹枝、根和樹幹。這適用於榆樹、橡樹和黃松。

如果你在遊戲中新增一棵樹,你可以為幾十棵樹建立樹的部分。但是建立一個樹類並讓其他樹繼承其屬性會更容易。

為什麼繼承很重要?

在面向物件程式設計中有一個概念叫做“保持乾燥”。DRY的意思是“不要重複自己”。如果你發現自己複製和貼上了大量程式碼,你也會給很多錯誤帶來空間。

假設您正在為一個新的Tamagotchi遊戲編寫程式碼。第一個虛擬寵物將是北極熊。所以在JavaScript/TypeScript中建立了一個名為PolarBear的類。

class PolarBear { private _weight: number = 990; c***tructor(weight: number = 0) { this._weight = weight } makeNoise() { c***ole.log("made a roar"); } eat() { c***ole.log("eats whatever it wants"); } sleep() { c***ole.log("got a good night's sleep"); } roam() { c***ole.log("wandered about aimlessly"); }}

然後你的老闆告訴你高層管理有了巨大的突破。他們意識到現在已經不是90年代了,他們可以在Tamagotchi中容納5千個以上的記憶體。現在他們想要所有的熊。

你捲起袖子回去工作,創造熊類的副本。然後你的老闆又來敲你的門。結果他們希望遊戲更具教育性。現在你必須為每隻寵物新增原產地資訊。

你不再複製程式碼了。現在你要為所有八種熊更改數百行程式碼。錯誤就是這樣發生的,錯誤就是這樣被引入的。

當你磨磨蹭蹭的時候,你的老闆又來了。現在上級管理層也希望所有的齧齒動物都參與進來。哦,還有一隻長頸鹿。

你知道當你做了,他們會想要猴子或其他東西。一定有更好的辦法。

與其創造下一代Tamogatchi,你可以一直玩現有的。

繼承來拯救

a polar bear that looks like it's **iling and waving at the camera

為了馴服你的虛擬動物園,你需要組織起來。繼承透過向類新增父關係和子關係來幫助您安排類。

黑熊、灰熊和懶熊都是熊。熊、齧齒動物和猴子都是動物。這就是我們構建家譜的方法。

a diagram showing the tree like relati***hips of inherited classes

程式碼的一部分是這樣的:

class Animal { private _weight: number; private _origin: string; c***tructor(weight: number = 0, origin: string = "") { this._weight = weight; this._origin = origin; } makeNoise(noise: string = "") { c***ole.log("made a noise that sounded like: " + noise); } eat(food: string = "") { c***ole.log("eats " + food); } sleep() { c***ole.log("got a good night's sleep"); } roam() { c***ole.log("wandered about aimlessly"); }}class Bear extends Animal { c***tructor(weight: number, origin: string) { super(weight, origin); } makeNoise(noise: string = "roar") { super.makeNoise(noise); } eat(food: string = "whatever it wants") { super.eat(food); }}class GrizzlyBear extends Bear { c***tructor(weight: number = 600, origin: string = "North America") { super(weight, origin); }}class Panda extends Bear { c***tructor(weight: number = 230, origin: string = "China") { super(weight, origin); } makeNoise() { super.makeNoise("squeek"); } eat() { super.eat("shoots and leaves"); }}

您可以在TypeScript沙盒中玩程式碼。

這是一個很大的示例,但是程式碼非常簡單,所有類都是Animal類的後代。你可以看到那隻熊和那隻動物。灰熊和熊貓擴大了熊的種類。Bear類建立預設的sound和eat函式。GrizzlyBear類使用這些預設函式,但Panda沒有。

換句話說,GrizzlyBear類不會重寫Bear函式。由於GrizzlyBear擴充套件了Bear,它將自動使用Bear定義的函式。但由於Panda重寫了makeNoise和eat函式,因此它將使用這些函式。

用“is-a,has-a”技巧尋找關係

為了弄清楚一個類是否真的應該擴充套件另一個類,您可以問問自己它們之間是否存在“is-a”或“has-a”關係。

  • 狐猴是猴子。
  • 袋鼠是有袋動物。
  • 不過,兔子的腳不是兔子。兔子有一隻腳。

這個例子有點簡單,但是在處理實際類時,它會非常有用。

實踐與理解

a proboscis monkey looking thoughtful

準備好應用你所學的了嗎?

  • 訪問沙盒並填寫上面示例中的其他動物類。
  • 新增猴子類。
  • 新增擴充套件monkey類的ProboscisMonkey類。

繼承不僅僅是組織良好的程式碼。它是面向物件程式設計的核心部分。繼承有助於簡化物件之間的通訊。它允許更高階的面向物件設計,比如多型性。您可以從TypeScript文件中瞭解有關繼承的更多資訊。

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

你可能感興趣的文章

c(c)和目標c(objective c)的區別

...援面向物件程式設計。 Objective C支援面向物件程式設計。繼承、抽象、封裝和多型性。 資料型別 C有陣列,結構,列舉。 Objective C擴充套件了資料型別,如NSArray、NSDictionary、NSSet等。 特點 C語言包含迴圈、函式、陣列、指...

  • 發佈於 2020-10-16 06:52
  • 閲讀 ( 55 )

序列圖(sequence diagram)和協作圖(collaboration diagram)的區別

...了開發。它是一個範例,有助於用物件對軟體進行建模。繼承、封裝等面向物件的概念可以用UML表示。這很容易理解。它甚至可以被非程式設計師使用。一般來說,一個圖表不足以理解整個系統。有各種型別的UML圖,每種圖都包...

  • 發佈於 2020-10-19 05:48
  • 閲讀 ( 63 )

超類(superclass)和子類(subclass)的區別

...。一個程式或軟體可以使用面向物件的程式設計來開發。繼承是OOP中的一個主要概念。它提高了程式碼的可重用性。它不需要從一開始就實現一個程式,而是允許將已經存在的類的屬性和方法繼承到一個新類中。這有助於使程式...

  • 發佈於 2020-10-19 19:56
  • 閲讀 ( 40 )

倍數(multiple)和多層次遺傳(multilevel inheritance)的區別

關鍵區別——多重繼承與多級繼承 面向物件程式設計(OOP)是一種使用類和方法設計程式的範例。真實世界的場景可以對映到物件。因此,很容易構建軟體解決方案。類是構建物件的藍圖。它包含屬性和方法。例如,在建立s...

  • 發佈於 2020-10-19 20:00
  • 閲讀 ( 48 )

多型性(polymorphism)和oop中的繼承(inheritance in oop)的區別

關鍵區別——oop中的多型與繼承 面向物件程式設計(OOP)是軟體開發中常用的方法。許多程式語言支援面向物件程式設計。面向物件程式設計是一種使用類和物件設計程式的方法。OOP中的類是建立物件的藍圖。類具有屬性和...

  • 發佈於 2020-10-19 21:16
  • 閲讀 ( 57 )

目標c(objective c)和敏捷的(swift)的區別

...e C是一種反射式、基於類、面向物件的程式語言。它支援繼承、封裝、多型等面向物件的程式設計概念。任何有效的C程式在目標C中也是有效的。 Objective C是C語言的一個超級集合,除了C語言基礎之外,它還包含了類、物件、屬...

  • 發佈於 2020-10-19 22:48
  • 閲讀 ( 58 )

班(class)和介面(interface)的區別

...方法。此外,介面不能用於建立物件。它們用於支援多個繼承並保護程式碼。 介面語法如下。Interface使用關鍵字“Interface”。 介面介面名稱{ 型別method1(引數_列表); 型別method2(引數_列表); } 根據上面的說明,介面只有宣...

  • 發佈於 2020-10-24 04:25
  • 閲讀 ( 55 )

javascript(javascript)和打字稿(typescript)的區別

...基於類的物件。C++、java背景的程式設計師對類、物件、繼承等概念非常熟悉。當他們試圖使用JavaScript程式設計時,很難在JavaScript場景中應用這些概念。要用JavaScript建立類,程式設計師應該建立一個函式。為了繼承,他們必須...

  • 發佈於 2020-10-24 05:23
  • 閲讀 ( 58 )

繼承(inheritance)和java介面(interface in java)的區別

繼承(inheritance)和java介面(interface in java)的區別 Java是Sun Microsystems公司開發的一種程式語言。Java可以用來開發各種應用程式。它是一種支援面向物件、結構化等多種正規化的語言,Java的主要優點是支援面向物件程式設計(OOP)...

  • 發佈於 2020-10-25 00:02
  • 閲讀 ( 63 )

如何用microsoftword輕鬆建立流程圖

想學習如何用Word**流程圖嗎?這很簡單。 ...

  • 發佈於 2021-03-18 09:47
  • 閲讀 ( 50 )