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