Class Modifiers 類別修飾子

控管外部函式庫對類別的繼承、實作、實例化權限,限制型別主體

修飾子順序 [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)

互斥規則

  1. sealed + abstract:sealed 內建 abstract,重複宣告禁止
  2. interface/final/sealed + mixin:不可混用
  3. 同一層不能同時宣告 base /interface/final /sealed

Class Modifiers 類別修飾子

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *