🌏

Dart3.0以降の修飾子たち

2023/06/19に公開

abstract

  • Dart3.0以前から存在している抽象クラス定義修飾子
  • 抽象クラスとして使用するほか、具象的な扱いも可能

サンプル

abstract class Hoge {
  String get name;
  int get age;
}

class Fuga extends Hoge {
  
  int get age => 100;

  
  String get name => 'ma';
}

base

  • base修飾子を付与されたクラス間の拡張 / 参照が可能
  • ライブラリ外での実装 / 参照を防ぐ

サンプル

base class HogeBase {
  void hoge() {
    print('hoge');
  }

  void fuga() {
    print('fuga');
  }
}

base class FugaBase extends HogeBase {
  void fugafuga() {
    hoge();
    fuga();
  }
}

// NG
class FugaNotBase extends HogeBase {
}

final

  • 継承を許可しない

サンプル

final class HogeFinal {
   void hoge() {
    print('hoge');
  }
}

// NG
class FugaFinal extends HogeFinal {
}

interface

  • クラス自体は拡張できない
  • よきせぬ方法で呼び出される可能性のあるメソッドをオーバーライドできないようにしている

サンプル

interface class HogeInterface {
  void hoge() {
    print('hoge');
  }

  void fuga() {
    print('fuga');
  }
}

class FugaInterface implements HogeInterface {
  
  void fuga() {
    print('hoge');
  }

  
  void hoge() {
    print('fuga');
  }
}

// NG
class Fuga extends HogeInterface {
}

abstract interface

  • abstractとinterfaceを組み合わせた修飾子
  • どちらも良いところを掛け合わせたような修飾子
  • abstractの抽象変数の定義などをサポート

サンプル

abstract interface class HogeAbstractInterface {
  String get name;

  int get age;

  void fugaName();
}

class FugaAbstractInterface extends HogeAbstractInterface {
  
  int get age => 100;

  
  void fugaName() {
    print('fuga');
  }

  
  String get name => 'name';
}

sealed

  • サブタイプセットを作成する抽象クラス
  • 独自のライブラリの外部拡張などを防ぐ効果がある
  • 自分自身を構築することはできず、sealedされたクラスを拡張したクラスにて構築される

サンプル

  • ネイティブによくあるResult型をsealedで再現することが可能
sealed class Result<S, E extends Exception> {
const Result();
}

final class Success<S, E extends Exception> extends Result<S, E> {
  const Success(this.value);
  final S value;
}

final class Failure<S, E extends Exception> extends Result<S, E> {
  const Failure(this.exception);
  final E exception;
}

mixin

  • Dart3以前からある機能で、複数のクラス間で再利用が可能なコードを定義することができる

サンプル

mixin class HogeMixin {
  void hoge() {
    print('hoge');
  }
}

class FugaMixin with HogeMixin {
  void fuga() {
    hoge();
  }
}

まとめ

Dart3.0以降から新たに

  • base
  • interface
  • final
  • sealed
    が追加されて、さらにFlutterライフが楽しくなる兆しになっているのではないでしょうか。
    今後のアップデートにも期待です。

参考

https://dart.dev/language/class-modifiers

Discussion