深入理解TypeScript抽象類

一、什麼是抽象類

抽象類是一種特殊的類,它不能被直接實例化,而是用來被繼承的。它的定義使用abstract關鍵字,並且至少包含一個抽象方法。抽象方法需要在子類中被實現。


abstract class Animal {
  abstract makeSound(): void;
}

class Dog extends Animal {
  makeSound() {
    console.log("汪汪汪");
  }
}

const dog = new Dog();
dog.makeSound(); // 汪汪汪

在上述代碼中,我們定義了一個抽象類Animal,其中包含了一個抽象方法makeSound。我們無法直接實例化Animal類,但是可以定義一個繼承Animal類的Dog類,並實現makeSound方法。這裡我們讓Dog類輸出汪汪汪。

二、抽象類的優點

抽象類相對於普通類的優點在於,它可以提供一種規範,強制子類必須實現某些方法。這對於約束項目中各個模塊的行為非常有幫助。

例如,我們可以定義一個抽象類Person,它包含了一個抽象方法speak,用於輸出個人的發言。然後我們可以定義兩個子類,一個是Worker類,一個是Student類。Worker類的speak方法可以輸出“I am working”,而Student類的speak方法可以輸出“I am studying”。


abstract class Person {
  abstract speak(): void;
}

class Worker extends Person {
  speak() {
    console.log("I am working");
  }
}

class Student extends Person {
  speak() {
    console.log("I am studying");
  }
}

const worker = new Worker();
const student = new Student();
worker.speak(); // I am working
student.speak(); // I am studying

三、抽象類的實現原理

在編譯後的JavaScript代碼中,抽象類被實現為普通的類,只不過包含了一個特殊的__abstract屬性,該屬性用於標記某些方法是抽象方法。


var Animal = /** @class */ (function () {
  function Animal() {
  }
  return Animal;
}());

var Dog = /** @class */ (function (_super) {
  __extends(Dog, _super);
  function Dog() {
    return _super !== null && _super.apply(this, arguments) || this;
  }
  Dog.prototype.makeSound = function () {
    console.log("汪汪汪");
  };
  return Dog;
}(Animal));

var dog = new Dog();
dog.makeSound(); // 汪汪汪

通過上述編譯後的代碼可以看出,在Animal類中並沒有包含任何的抽象方法,只是在定義Animal類時添加了一個__abstract屬性,用於標記makeSound是抽象方法。在Dog類中,我們對makeSound方法做了具體的實現。

四、使用抽象類的注意點

抽象類雖然有很多優點,但是我們還是需要注意一些細節問題。

1. 如果一個類繼承了抽象類,它必須實現該抽象類中的所有抽象方法,否則會報錯。


abstract class Person {
  abstract speak(): void;
  abstract run(): void;
}

class Worker extends Person {
  speak() {
    console.log("I am working");
  }
  // 錯誤,Worker類沒有實現run方法
}

class Student extends Person {
  speak() {
    console.log("I am studying");
  }
  run() {
    console.log("I am running");
  }
}

const worker = new Worker(); // 報錯
const student = new Student();
student.run(); // I am running

2. 抽象方法不能有具體的實現,在抽象類中定義的方法只有名稱和參數列表,沒有方法體。


abstract class Person {
  abstract speak(): void {
    console.log("I am speaking");
  }
  // 錯誤,抽象方法不能有具體的實現
}

3. 抽象類也是可以被擴展的,我們可以繼承一個抽象類,並在子類中實現它的抽象方法。這樣,我們可以通過多重繼承的方式來構建更加複雜的類和類層次。


abstract class Animal {
  abstract makeSound(): void;
}

abstract class Person {
  abstract speak(): void;
}

class Dog extends Animal {
  makeSound() {
    console.log("汪汪汪");
  }
}

class Student extends Person {
  speak() {
    console.log("I am studying");
  }
}

class WorkingDog extends Dog, Student {
  // WorkingDog同時繼承了Dog和Student類,實現了makeSound和speak方法
}

const workingDog = new WorkingDog();
workingDog.makeSound(); // 汪汪汪
workingDog.speak(); // I am studying

五、總結

抽象類是一種很有用的語言特性,它可以為我們提供一種規範方式,強制子類實現一些必要的方法,從而提高代碼的可讀性和可維護性。

不過,在使用抽象類時,我們也需要注意一些細節問題,以避免出現代碼錯誤和潛在的bug。

原創文章,作者:JGGW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131366.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JGGW的頭像JGGW
上一篇 2024-10-03 23:44
下一篇 2024-10-03 23:44

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、字節與比特 在討論byte轉int之前,我們需要了解字節和比特的概念。字節是計算機存儲單位的一種,通常表示8個比特(bit),即1字節=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟件,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r為前綴的字符串。r字符串中的反斜杠(\)不會被轉義,而是被當作普通字符處理,這使得r字符串可以非常方便…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱“存儲程序控制原理”,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的總線來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25

發表回復

登錄後才能評論