🌏
Dart3.0以降の修飾子たち
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ライフが楽しくなる兆しになっているのではないでしょうか。
今後のアップデートにも期待です。
参考
Discussion