1.靜態屬性&靜態方法
class Person { public name: string; // 保護屬性 public age: number = 20; static sex: string = "男"; constructor(name: string) { this.name = name; }; run() { // 實例方法 console.log(`${this.name}在奔跑`); } work() { console.log(`${this.name}在工作`); } static print() { //靜態方法 console.log('print方法'); console.log('print方法' + this.age); // 報錯,靜態方法里無法直接調用當前類屬性(只能調用靜態屬性)this.age是undefined console.log('print方法' + this.sex); } } let p = new Person("張三") // 調用實例方法 p.run(); // 調用靜態方法 Person.print();
2.多態 ——一個函數,在不同情況下表現出不同的狀態,就稱為多態
包括兩種情況:
- 重載(overload):一個函數,根據傳入的實參值不同,選擇執行不同的邏輯
- 重寫(override):子對象中定義了和父對象中同名的方法,當使用這個方法時,使用的時子對象這個方法,而不會使用父對象中的方法
以重寫為例:
class Animal { name: string; constructor(name: string) { this.name = name; } // 父類的方法 eat() { console.log('吃的方法'); } } class Dog extends Animal { constructor(name: string) { super(name); } // 字類改寫 eat() { return this.name + "吃肉" } } class Cat extends Animal { constructor(name: string) { super(name) } // 字類改寫 eat() { return this.name + "吃魚" } }
2.抽象類&抽象方法
(1)抽象類
標准:一個類要求它的字類必須包含指定方法,它是提供其他類繼承的基類,不能被直接實例化。
定義抽象類:
abstract class Animal { abstract eat():any ; } let a=new Animal(); // 報錯:無法創建抽象類的實例
(2)抽象方法
抽象方法在子類里面必須實現
// 父類 abstract class Animal { public name: string; constructor(name: string) { this.name = name; } abstract eat(): any; } // 子類Dog class Dog extends Animal { constructor(name: string) { super(name); } // 抽象類的子類必須實現抽象類里面的抽象方法 eat() { console.log(this.name + '在吃肉'); } } let d = new Dog('達摩'); d.eat(); // 子類Cat class Cat extends Animal { constructor(name: string) { super(name); } }
子類Cat不實現eat()方法,會報錯:非抽象類“Cat”不會實現繼承自“Animal”類的抽象成員“eat”,即子類Cat不會自動繼承父類的方法