控管外部函式庫對類別的繼承、實作、實例化權限,限制型別主體
修飾子順序 [abstract] [base/interface/final/sealed] [mixin] class;部分修飾子互斥
1. 無修飾子
任意函式庫皆可建立實例、繼承、實作
// a.dart
class Vehicle {
void move() {}
}
// b.dart
import 'a.dart';
Vehicle v = Vehicle();
class Car extends Vehicle {}
class Mock implements Vehicle {}
Code language: JavaScript (javascript)
2. abstract 抽象類別
無法建立實例;外部程式可使用 extends /implements
abstract class Vehicle {
void move(); // 抽象方法
}
// 合法
class Car extends Vehicle {
@override void move() {}
}
class Mock implements Vehicle {
@override void move() {}
}
// Vehicle(); // 發生錯誤,無法實例化
Code language: JavaScript (javascript)
3. base class
√ 允許 new|√ 外部可 extends|× 外部禁止 implements
確保子類別一定繼承父類別實作,避免外部建立偽實作
// lib/a.dart
base class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
base class Car extends Vehicle {} // √ 繼承時必須標註 base/final/sealed
// class Mock implements Vehicle {} // × 外部不允許實作
Code language: JavaScript (javascript)
4. interface class
√ 允許 new|× 外部不可 extends|√ 外部可 implements
// a.dart
interface class Vehicle {
void move() => print("move");
}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // × 外部不能繼承
class Mock implements Vehicle { // √ 允許實作
@override void move() {}
}
Code language: PHP (php)
abstract interface
純介面,最常使用
無法建立實例,外部僅能進行實作
abstract interface class Vehicle {
void move();
}
class Mock implements Vehicle {
@override void move() {}
}
Code language: PHP (php)
5. final class
√ 允許 new|× 外部不可 extends|× 外部不可 implements
外部完全無法衍生類別,穩定對外 API
// a.dart
final class Vehicle {}
// main.dart
import 'a.dart';
Vehicle v = Vehicle();
// class Car extends Vehicle {} // ❌
// class Mock implements Vehicle{} // ❌
Code language: JavaScript (javascript)
6. sealed class(密封類別)
× 不能 new|× 外部禁止 extends/implements;子類別只能定義在同一檔案
編譯器可辨識所有直接子類別,switch 陳述式強制完整匹配
sealed class Vehicle {}
class Car extends Vehicle {}
class Bike extends Vehicle {}
void test(Vehicle v) {
switch(v) {
case Car(): print("car");
case Bike(): print("bike");
}
}
// Vehicle(); // ❌ sealed 隱含 abstract,無法實例化
Code language: PHP (php)
互斥規則
sealed+abstract:sealed 內建 abstract,重複宣告禁止interface/final/sealed+mixin:不可混用- 同一層不能同時宣告 base /interface/final /sealed
Class Modifiers 類別修飾子
Previous: Extension Types
Next: dart:math 函式庫