一、什麼是抽象類
抽象類是一種特殊的類,它不能被直接實例化,而是用來被繼承的。它的定義使用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