Dart: インターフェースの定義には abstract interface を使うと良いかも?

Dart: インターフェースの定義には abstract interface を使うと良いかも?

June 2, 2023

Dart 3 になるまでの間、Dart には interface のキーワードが存在しませんでした。

インターフェースを定義したい場合は abstract キーワードが使われてきました。

abstract class Animal {
  void sound();
}

class Dog implements Animal {
  @override
  void sound() {
    print('bowwow');
  }
}

class Cat implements Animal {
  @override
  void sound() {
    print('meow');
  }
}

Dart 3 になり abstract interface という書き方もできるようになりました。より厳密に書きたいのであれば、今後はこちらの利用も検討すると良いでしょう。

abstract interface が付与されたクラスは implements することはできますが、extend することはできません。一方で単なる abstract だと extends することも許可されます。

// 👇 abstract interface
abstract interface class Animal {
  void sound();
}

class Dog implements Animal {
  @override
  void sound() {
    print('bowwow');
  }
}

class Cat implements Animal {
  @override
  void sound() {
    print('meow');
  }
}

また新たに final という修飾子も追加されました。

これを付与するとそのクラスを extends/implements することができなくなります。

// 👇 abstract interface
abstract interface class Animal {
  void sound();
}

// 👇 final
final class Dog implements Animal {
  @override
  void sound() {
    print('bowwow');
  }
}

// 👇 final
final class Cat implements Animal {
  @override
  void sound() {
    print('meow');
  }
}

特に最近のソフトウェア開発では、継承よりも合成が好まれるため、厳密にやろうとするとほぼすべてのクラスに final 修飾子がつくことになるような気もします。

だからといって本当にすべてに final をつけて回るべきなのかは議論を呼びそうなところですね。

クラス修飾子の詳細は以下の記事が参考になります。

https://medium.com/@kvenn/dart-3-0-best-new-features-why-you-should-care-429e739f2690#dfcf