第四話:類

基本類

new實(shí)例化類時摘昌,會創(chuàng)建一個Animal類型的新對象,并執(zhí)行constructor初始化它:

class Animal {

? ? char: string; // 測處為分號不是逗號

? ? constructor (msg: string) {

? ? ? ? this.char = msg;

????}

? ? say() {

? ? ? ? return `hello ${this.char}`

????}

};

let myAn = new Animal('dog');

繼承

允許使用繼承來擴(kuò)展現(xiàn)有的類,通過extends關(guān)鍵字:

class Animal {

? ? move(len: number = 0) {

? ? ? ? console.log(`animal moved ${len} m`)

????}

}

class Dog extends Animal {

? ? bark() {

? ? ? ? console.log('wof, wof');

????}

}

const dog = new Dog();

dog.bark(); // Dog類本身的方法

dog.move(10); //從Animal類繼承來的方法

注釋:此例子中,Dog類是一個派生類,它派生自Animal基類迈螟,派生類被稱作 子類叉抡,基類被稱作 超類。

在子類里重寫父類的方法

class Animal {

? ? name: string,

? ? constructor(theName: string) {this.name = theName;}

? ? move(len: number = 0) {

? ? ? ? console.log(`${this.name} moved ${len}m.`);

????}

}

class Snake extends Animal {

? ? constructor(name: string) { super(name); }

? ? move(len = 5) {

? ? ? ? console.log("Slithering...");

? ? ? ? super.move(len);

????}

}

class Horse extends Animal {

? ? constructor(name: string) {super(name);}

? ? move(len = 45) {

? ? ? ? console.log("Galloping...")

? ? ? ? super.move(len);

????}

}

let sam = new Snake("Sammy");

let tom:Animal = new Horse("Tommy");

sam.move();

tom.move(34);

輸出結(jié)果:Slithering...

? ? ? ? ? ? ? ? ? Sammy moved 5m

? ? ? ? ? ? ? ? ? Galloping...

? ? ? ? ? ? ? ? ? Tommy moved 34m

說明:派生類包含一個構(gòu)造函數(shù)時答毫,它必須調(diào)用super()褥民,它會執(zhí)行基類的構(gòu)造函數(shù)。

公共烙常,私有與受保護(hù)的修飾符

默認(rèn)為public

ts中定義的類中的成員默認(rèn)為public轴捎,成員不用其他修飾符修飾時,可以自由的訪問程序里定義的成員蚕脏。

理解private:私有

當(dāng)成員被標(biāo)記為private侦副,它就不能被聲明它的類的外部訪問。

class Animal {

? ? private name: string;

? ? constructor(theName: string) { this.name = theName; }

}

new Animal('Cat').name; // error: name is private

理解protected:受保護(hù)的

protected和private相似驼鞭,但有一點(diǎn)秦驯,protected成員在派生類中仍然可以訪問。

若構(gòu)造很熟constructor被標(biāo)記為protected挣棕,則該類不能被實(shí)例化译隘。

readonly修飾符

只讀屬性必須在聲明時或構(gòu)造函數(shù)里被初始化。

參數(shù)屬性

參數(shù)屬性通過給構(gòu)造函數(shù)參數(shù)添加一個訪問限定符來聲明洛心。使用private固耘,public,protected限定一個參數(shù)屬性會聲明并初始化一個私有/公共/被保護(hù)的成員词身。

class Animal {

? ? constructor(private name: string) {}

? ? move(meter: number) {

? ? ? ? console.log(`${this.name} moved ${meter}m`);

????}

}

存取器

通過get和set來截取對對象成員的訪問厅目。

靜態(tài)屬性:static

使用static定義的成員,每個實(shí)例想要訪問這個成員時法严,都需要在成員前面加上類名损敷,如同實(shí)例屬性上使用this.。

class Grid {

? ? static origin = 10;

? ? constructor (public scale: number) {}

? ? lowLen(x: number) {

? ? ? ? let length01 = x*this.scale - Grid.origin;

? ? ? ? return length01;

????}

}

let grid01 = new Grid(2.0);

console.log(grid01.lowLen(60)); //110

抽象類:abstract

1深啤、抽象類作為其他派生類的基類使用拗馒,一般不能直接被實(shí)例化。

2溯街、抽象類中的抽象方法不包含具體實(shí)現(xiàn)且必須在派生類中實(shí)現(xiàn)诱桂。

abstract class Department {

? ? constructor(public name: string) {}

? ? printName(): void {

? ? ? ? console.log('Department name: ' + this.name);

? ? }

? ? abstract printMeeting(): void; // 必須在派生類中實(shí)現(xiàn)

}

class AccountingDepartment extends Department {

? ? constructor() {

? ? ? ? super('Accounting and Auditing'); // 在派生類的構(gòu)造函數(shù)中必須調(diào)用 super()

? ? }

? ? printMeeting(): void {

? ? ? ? console.log('The Accounting Department meets each Monday at 10am.');

? ? }

? ? generateReports(): void {

? ? ? ? console.log('Generating accounting reports...');

? ? }

}

let department: Department; // 允許創(chuàng)建一個對抽象類型的引用

department = new Department(); // 錯誤: 不能創(chuàng)建一個抽象類的實(shí)例

department = new AccountingDepartment(); // 允許對一個抽象子類進(jìn)行實(shí)例化和賦值

department.printName();

department.printMeeting();

department.generateReports(); // 錯誤: 方法在聲明的抽象類中不存在

高級技巧

把類當(dāng)做接口使用

class Point {

? ? x: number;

? ? y: number;

}

interface Point3d extends Point {

? ? z: number;

}

let point3d: Point3d = {x: 1, y: 2, z: 3};

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市苫幢,隨后出現(xiàn)的幾起案子访诱,更是在濱河造成了極大的恐慌,老刑警劉巖韩肝,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異九榔,居然都是意外死亡哀峻,警方通過查閱死者的電腦和手機(jī)涡相,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剩蟀,“玉大人催蝗,你說我怎么就攤上這事∮兀” “怎么了丙号?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缰冤。 經(jīng)常有香客問我犬缨,道長,這世上最難降的妖魔是什么棉浸? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任怀薛,我火速辦了婚禮,結(jié)果婚禮上迷郑,老公的妹妹穿的比我還像新娘枝恋。我一直安慰自己,他們只是感情好嗡害,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布焚碌。 她就那樣靜靜地躺著,像睡著了一般霸妹。 火紅的嫁衣襯著肌膚如雪十电。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天抑堡,我揣著相機(jī)與錄音摆出,去河邊找鬼。 笑死首妖,一個胖子當(dāng)著我的面吹牛偎漫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播有缆,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼象踊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棚壁?” 一聲冷哼從身側(cè)響起杯矩,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袖外,沒想到半個月后史隆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡曼验,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年泌射,在試婚紗的時候發(fā)現(xiàn)自己被綠了粘姜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡熔酷,死狀恐怖孤紧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拒秘,我是刑警寧澤号显,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站躺酒,受9級特大地震影響押蚤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阴颖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一活喊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧量愧,春花似錦钾菊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至累颂,卻和暖如春滞详,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背紊馏。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工料饥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朱监。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓岸啡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赫编。 傳聞我的和親對象是個殘疾皇子巡蘸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容