Typescript初探 類與繼承

2021-10-21 20:42:34 字數 4562 閱讀 5969

類的關鍵字 clss可以聲名乙個類,類可以從字面上理解,類裡面有很多態別的資料或者方法,類可以被子類或者介面繼承。

class

greeter

greet()

}let greeter =

newgreeter

("world"

);

上面是乙個類的使用,可見類裡面可以囊括多種資料介面。我們一般這樣說:這個類有3個成員:乙個叫做 greeting的屬性,乙個建構函式和乙個 greet方法。

我們在引用任何乙個類成員的時候都用了 this, 它表示我們訪問的是類的成員。

繼承

繼承的關鍵字extends可以繼承乙個類,繼承是幹什麼的?直白一點就是拿走那些資料夫類的非私有的東西。

看下面的例子:

class

animal

move

(distanceinmeters:

number=0

)moved

$m.`);

}}class

snake

extends

animal

move

(distanceinmeters =5)

}class

horse

extends

animal

move

(distanceinmeters =45)

}let sam =

newsnake

("sammy the python");

let tom: animal =

newhorse

("tommy the palomino");

sam.

move()

;//slithering... sammy the python moved 5m

tom.

move(34

);//galloping... tommy the palomino moved 34m

規定:子類在constructor中必須使用super關鍵字,這個super代表著對父類的呼叫。

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

class

animal

public

move

(distanceinmeters:

number

)moved

$m.`);

}}

類裡面public關鍵字是定義此方法或者屬性是公共的,可被子類繼承的。

public很好理解當什麼都不聲名時,預設是public

private

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

class

animal

}new

animal

("cat"

).name;

// 錯誤: 'name' 是私有的.

typescript使用的是結構性型別系統。 當我們比較兩種不同的型別時,並不在乎它們從何處而來,如果所有成員的型別都是相容的,我們就認為它們的型別是相容的。

然而,當我們比較帶有 private或 protected成員的型別的時候,情況就不同了。 如果其中乙個型別裡包含乙個 private成員,那麼只有當另外乙個型別中也存在這樣乙個 private成員, 並且它們都是來自同一處宣告時,我們才認為這兩個型別是相容的。 對於 protected成員也使用這個規則。

我們要怎麼樣理解這段話?看例子

class

animal

}class

rhino

extends

animal

}class

employee

}let animal =

newanimal

("goat");

let rhino =

newrhino()

;let employee =

newemployee

("bob");

animal = rhino;

animal = employee;

// 錯誤: animal 與 employee 不相容.

也就是說animal類和employee 不相容,父類裡面的私有屬性不可以在子類中訪問但可以在super中傳遞。

protected

protected修飾符與 private修飾符的行為很相似,但有一點不同, protected成員在派生類中仍然可以訪問。例如:

class

person

}class

employee

extends

person

public

getelevatorpitch()

and i work in $.`

;}}let howard =

newemployee

("howard"

,"sales");

console

.log

(howard.

getelevatorpitch()

);console

.log

(howard.name)

;// 錯誤

靜態屬性

到目前為止,我們只討論了類的例項成員,那些僅當類被例項化的時候才會被初始化的屬性。 我們也可以建立類的靜態成員,這些屬性存在於類本身上面而不是類的例項上。 在這個例子裡,我們使用 static定義 origin,因為它是所有網格都會用到的屬性。 每個例項想要訪問這個屬性的時候,都要在 origin前面加上類名。 如同在例項屬性上使用 this.字首來訪問屬性一樣,這裡我們使用 grid.來訪問靜態屬性。

class

grid

;calculatedistancefromorigin

(point:

)constructor

(public scale:

number)}

let grid1 =

newgrid

(1.0);

// 1x scale

let grid2 =

newgrid

(5.0);

// 5x scale

console

.log

(grid1.

calculatedistancefromorigin()

);console

.log

(grid2.

calculatedistancefromorigin()

);

換成漢語說就是靜態屬性直接通過類名加.的形式訪問,而且靜態屬性屬於類本身,無需例項化。

抽象類

看到抽象這個詞先不要慌,因為抽象其實並不是你理解的那麼抽象

抽象類做為其它派生類的基類使用。 它們一般不會直接被例項化。 不同於介面,抽象類可以包含成員的實現細節。 abstract關鍵字是用於定義抽象類和在抽象類內部定義抽象方法。

abstract

class

animal

}

抽象類中的抽象方法不包含具體實現並且必須在派生類中實現。 抽象方法的語法與介面方法相似。 兩者都是定義方法簽名但不包含方法體。 然而,抽象方法必須包含 abstract關鍵字並且可以包含訪問修飾符。

abstract

class

department

printname()

:void

abstract

printmeeting()

:void

;// 必須在派生類中實現

}class

accountingdepartment

extends

department

printmeeting()

:void

generatereports()

:void

}let department: department;

// 允許建立乙個對抽象型別的引用

department =

newdepartment()

;// 錯誤: 不能建立乙個抽象類的例項

department =

newaccountingdepartment()

;// 允許對乙個抽象子類進行例項化和賦值

department.

printname()

;department.

printmeeting()

;department.

generatereports()

;// 錯誤: 方法在宣告的抽象類中不存在

Typescript學習記錄 回顧ES5繼承

b類繼承a類的方法 function a name run a.prototype.age 21 a.prototype.coding function coding var a newa aaa a.run a.coding es5的繼承,b繼承a function b name 繼承a原型鏈的拷...

類與物件的初探

物件 object 類是具有相似內部狀態和運動規律的實體的集合 或統稱 抽象 例 string 就是乙個物件 類 calss 描述了一組有相同特性 屬性 和相同行為 方法 的物件。特性 1 抽象 類的定義中明確指出類是一組具有內部狀態和運動規律物件的抽象,抽象是一種從一般的觀點看待事物的方法,它要求...

TypeScript學習筆記3 類與介面

介面 inte ces 可以用於對 物件的形狀 shape 進行描述。implements 實現 implements 是物件導向中的乙個重要概念。類實現介面 乙個類只能繼承自另乙個類,有時候不同類之間可以有一些共有的特性,這時候就可以把特性提取成介面 inte ces 用 implements 關...