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

純粋なインターフェース、最もよく使われる

インスタンス化不可、外部からは implements のみ許可

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 クラス修飾子

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です