農林漁牧網

您現在的位置是:首頁 > 農業

TypeScript(5)類、繼承、多型

2023-01-09由 程式那點事 發表于 農業

當類的方式為什麼繼承

前言

對於傳統的 JavaScript 程式我們會使用

函式

基於原型的繼承

來建立可重用的元件,但對於熟悉使用面向物件方式的程式設計師使用這些語法就有些棘手,因為他們用的是基於類的繼承並且物件是由類構建出來的。 從 ECMAScript 2015,也就是 ES6 開始, JavaScript 程式設計師將能夠使用基於類的面向物件的方式。 使用 TypeScript,我們允許開發者現在就使用這些特性,並且編譯後的 JavaScript 可以在所有主流瀏覽器和平臺上執行,而不需要等到下個 JavaScript 版本。

TypeScript(5)類、繼承、多型

如果你使用過C#或Java,你會對這種語法非常熟悉。我們聲明瞭一個

Person

類。這個類有3個屬性、一個建構函式和一個

sayHi

方法。

我們使用

new

構造了

Person

類的一個例項。它會呼叫建構函式,建立一個

Person

型別的新物件,並執行建構函式初始化它。最後透過

person

物件呼叫其

sayHi

方法

繼承

在 TypeScript 裡,我們可以使用常用的面向物件模式。 基於類的程式設計中一種最基本的模式是允許使用繼承來擴充套件現有的類。

TypeScript(5)類、繼承、多型

我們定義了一個超類Animal,兩個派生類Snake和Horse,並且建立了2個例項物件

snake

horse

透過

snake。run()

,我們可以看到Snake中有run方法,那麼就進行呼叫,最後結果如下

TypeScript(5)類、繼承、多型

透過

horse。run()

,我們可以看到Horse中有run方法,那麼進行呼叫,最後結果如下:

TypeScript(5)類、繼承、多型

多型

定義:不同型別的物件針對相同的方法,產生了不同的的行為

接著上面的程式碼

TypeScript(5)類、繼承、多型

這個例子演示瞭如何在子類裡可以重寫父類的方法。

Snake

類和

Horse

類都建立了

run

方法,它們重寫了從

Animal

繼承來的

run

方法,使得

run

方法根據不同的類而具有不同的功能。注意,即使

tom

被宣告為

Animal

型別,但因為它的值是

Horse

,呼叫

tom。run(34)

時,它會呼叫

Horse

裡重寫的方法。

TypeScript(5)類、繼承、多型

公共,私有與受保護的修飾符

預設為public

在上面的例子裡,我們可以自由的訪問程式裡定義的成員。 如果你對其它語言中的類比較瞭解,就會注意到我們在之前的程式碼裡並沒有使用

public

來做修飾;例如,C#要求必須明確地使用

public

指定成員是可見的。 在

TypeScript

裡,成員都預設為

public

你也可以明確的將一個成員標記成

public

。 我們可以用下面的方式來重寫上面的

Animal

類:

TypeScript(5)類、繼承、多型

理解private

當成員被標記成 private時,它就不能在宣告它的類的外部訪問。比如:

TypeScript(5)類、繼承、多型

理解 protected

protected

修飾符與

private

修飾符的行為很相似,但有一點不同,

protected

成員在派生類中仍然可以訪問。例如

TypeScript(5)類、繼承、多型

readonly修飾符

你可以使用

readonly

關鍵字將屬性設定為只讀的。 只讀屬性必須在宣告時或構造函數里被初始化。

TypeScript(5)類、繼承、多型

引數屬性

在上面的例子中,我們必須在 Person 類裡定義一個只讀成員 name 和一個引數為 name 的建構函式,並且立刻將

name

的值賦給

this。name

,這種情況經常會遇到。 引數屬性可以方便地讓我們在一個地方定義並初始化一個成員。 下面的例子是對之前 Person 類的修改版,使用了引數屬性

TypeScript(5)類、繼承、多型

注意看我們是如何捨棄引數

name

,僅在構造函數里使用

readonly name: string

引數來建立和初始化

name

成員。 我們把宣告和賦值合併至一處。

引數屬性透過給建構函式引數前面新增一個訪問限定符來宣告。使用

private

限定一個引數屬性會宣告並初始化一個私有成員;對於

public

protected

來說也是一樣。

存取器

TypeScript

支援透過

getters/setters

來擷取對物件成員的訪問。 它能幫助你有效的控制對物件成員的訪問。

下面來看如何把一個簡單的類改寫成使用

get

set

。 首先,我們從一個沒有使用存取器的例子開始。

TypeScript(5)類、繼承、多型

TypeScript(5)類、繼承、多型

靜態屬性

靜態成員:在類中透過

static

修飾的屬性或方法,也就是靜態成員或靜態方法,靜態成員在使用時是透過

類名。

的這種語法來呼叫

TypeScript(5)類、繼承、多型

抽象類

抽象類:包含抽象方法(抽象方法一般沒有任何具體的內容的實現),也可以包含例項方法,抽象類是不能被例項化,為了讓子類進行例項化及實現內部的抽象方法。

TypeScript(5)類、繼承、多型

本文作者:

Silent丿丶黑羽

本文連結:

https://www。cnblogs。com/jiakecong/p/16392796。html