Dart 知識點 - 抽象類和介面
攜手創作,共同成長!這是我參與「掘金日新計劃 · 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 {
}
往期精彩推薦
如果讀者覺得文章還可以,不防一鍵三連:關注➕點贊➕收藏
- 前端開發中 5 個很讚的資源
- 懂點心理學 - 馬太效應
- Flutter 構建一個 todo list 應用
- Dart 知識點 - 資料型別
- Dart 知識點 - 混入 Mixin
- Dart 知識點 - 集合 List, Set, Map
- Flutter - 使用 push(), pop() 和路由進行導航
- Dart 知識點 - 面向物件基礎
- Flutter: Stateful 掛件 vs Stateless 掛件
- Flutter 實現登入 UI
- Dart 知識點 - 抽象類和介面
- 自 2020 年以來全球的開源商業化軟體融資情況
- IstioCon 2022 回顧及錄影、PPT 分享
- 網頁實現 1CM 物理長度
- Flutter 開發出現的那些 Bugs 和解決方案「持續更新... 」
- 仿寫新聞客戶端
- Beyond Istio OSS —— Istio 服務網格的現狀及未來
- 在外企的工作生活「年中總結」
- 如何在 Istio 中整合 SPRIRE?
- Javascript尾遞迴程式設計