Dartの継承

Dartでは、extendsキーワードを用いてクラスの継承を行うことができます。単一継承のみ可能で、多重継承はできません。

以下の例では、抽象クラスDogを継承して、Poodleクラスを実装しています。抽象クラスを定義するためのキーワードはabstractです。

abstract class Dog {
  final String name;

  Dog({this.name});
}

class Poodle extends Dog {
  Poodle({name}) : super(name: name);
}

Dog poodle = Poodle(name: 'pochi');

抽象クラスでは、抽象メソッドを定義することができます。抽象メソッドは、メソッドのシグネチャのみ定義し、メソッド本体を持たないメソッドです。具象クラスの中では定義できません。また、抽象メソッドは、具象クラスの中で必ずオーバーライドしなければなりません。メソッドをオーバーライドするには、対象となるメソッドに@overrideアノテーションを付与します。

abstract class Dog {
  // 略
  void bark(); // 抽象メソッド
}

class Poodle extends Dog {
  // 略
  @override
  void bark() {
    print('bow wow!');
  }
}

また抽象クラスにおいては、メソッドの実装を持つことも可能です。この場合、具象クラスにおいてメソッドをオーバーライドする必要は必ずしもありませんが、オーバーライドすることも可能です。この時、必要に応じてsuper.メソッド名()で継承元のメソッドを呼び出すことが可能です。

abstract class Dog {
  // 略
  void run() {
    print('running...');
  }
}

class Poodle extends Dog {
  // 略
  @override
  void run() {
    super.run();
    print('it is a poodle...');
  }
}

メソッドだけでなく、メンバ変数についてもオーバーライドすることが可能です。なお、メンバ変数を抽象的に定義する方法はわかりませんでした。Dart 2.8.2では実装されていないものと思われます。

abstract class Dog {
  // 略
  final String size = 'medium';
}

class Poodle extends Dog {
  // 略
  @override
  final String size = 'large';
}

クラスやメソッドのオーバーライドを禁止する機能についても、おそらくDart 2.8.2では実装されていないです。

筆者

茨城県つくば市在住のソフトウェアエンジニアです。得意領域はAndroidとFlutterです。「Jetpack ComposeによるAndroid MVVMアーキテクチャ入門」の著者です。

👉もっと詳しく