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|x 外部 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 {} // X 外部禁止implement
Code language: JavaScript (javascript)

4. interface class

√ 可 new|X 外部 extends|√ 外部 implements

// a.dart
interface class Vehicle {
  void move() => print("move");
}

// main.dart
import 'a.dart';
Vehicle v = Vehicle();

// class Car extends Vehicle {} // X 外部不能继承
class Mock implements Vehicle { // √ 允许实现
  @override void move() {}
}
Code language: PHP (php)

abstract interface

纯接口,最常用

不能实例化,外部仅能 implement

abstract interface class Vehicle {
  void move();
}
class Mock implements Vehicle {
  @override void move() {}
}
Code language: PHP (php)

5. final class

√ 可 new|x 外部 extends|x 外部 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(密封类)

x 不能 new|x 外部 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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注