Dart 知識點 - 抽象類和介面

語言: CN / TW / HK

攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第10天,點選檢視活動詳情

推薦使用線上編輯器 dartpad.cn 進行學習,測試~

抽象類

抽象類用於描述父類擁有的一種行為,但是無法給出細節實現,需要子類來實現抽象的細節。可以簡單理解抽象類就是虛擬碼

抽象類一般會被定義為父類,給子類繼承

抽象類的定義格式

格式如下:

```bash abstract class className { // 成員變數 [static][const][final] type name;

// 成員方法 [type] methodName(paramType: paramName ...); } ```

相關的欄位說明,我們已經在之前的文章講過。不熟悉的讀者,可以進入文章 Dart 知識點 - 面向物件基礎學習,這裡不再贅述。

應用例子

我們定義一個抽象類 Shape,然後定義正方形 Square 類來繼承抽象類並重寫抽象類的方法。如下:

```bash void main() { Square square = new Square(10, 20); var area = square.area(); print('Area is ${area}.'); // Area is 200. }

abstract class Shape { double width = 0.0;

double height = 0.0;

double area(); }

class Square extends Shape { Square(double width, double height) { this.width = width; this.height = height; }

@override double area() { return super.width * super.height; } } ```

介面

Dart 的介面沒有用 interface 關鍵字定義介面,而是普通類或抽象類都可以作為介面被實現。

  • 如果實現的類是普通類,需要將普通類和抽象類中的方法和屬性全部重寫一遍。

Dart 中只允許繼承一個類,但是可以實現多個介面。

我們案例走一遍,如下:

```bash void main() { Dog dog = new Dog();

dog.display(); // Animal name: Jimmy

dog.walk(); // I can walk.

}

// 抽象類 Animal abstract class Animal { String name = 'Jimmy';

void display() { print('Animal name: ${name}'); }

void eat(); }

// 抽象類作為介面 abstract class SwimAbility { bool canSwim = false; void swim(); }

// 普通類作為介面 class WalkAbility { void walk() {} }

class Dog extends Animal implements SwimAbility, WalkAbility {

bool canSwim = true; // 宣告介面中的屬性

// 重寫吃東西的方法 @override void eat() {

}

// 重寫游泳的方法 @override void swim() {

}

// 重寫散步的方法 @override void walk() { print('I can walk.'); } } ```

如何區分抽象類和介面

抽象類和介面如何區分?

  • 通過字面意思上區分(非嚴謹,看個人寫程式碼的習慣),比如:

```bash // 抽象類 abstract class Animal { }

// 抽象類作為介面 abstract class SwimAbility { }

// 普通類作為介面 class WalkAbility { } ```

  • 通過子類中繼承和介面的關鍵字來區別,比如:

bash // extends 後面跟的是父類,implements 後面跟的是介面 class Dog extends Animal implements SwimAbility, WalkAbility { }

往期精彩推薦

如果讀者覺得文章還可以,不防一鍵三連:關注➕點贊➕收藏