Dartのclass-extends文

Flutter/Dart

この記事では、Dartのclass-extends文について書いていきます。class文を拡張したものなので注意をしてください。

Dartのclass文
この記事では、Dartのclass文について書いていきます。サンプル// 1. クラスの定義class Dog { // プロパティ String name; int age; // コンストラクタ(初期化のための特別なメソッド) Dog(…

サンブル

// 親クラス(ベースとなるクラス)
class Animal {
  String name;

  Animal(this.name);

  void makeSound() {
    print('$name が鳴いています。');
  }
}

// 子クラス(Animalを継承)
class Dog extends Animal {
  // 親クラスのコンストラクタを呼び出す (super)
  Dog(String name) : super(name);

  // 親クラスのメソッドを書き換える(オーバーライド)
  @override
  void makeSound() {
    print('$name: ワンワン!');
  }

  // 子クラス独自のメソッドを追加
  void fetch() {
    print('$name はボールを取ってきた!');
  }
}

void main() {
  // Dogクラスのインスタンスを作成
  var myDog = Dog('ポチ');

  // 1. 親から引き継いだメソッド(オーバーライドされた内容)を実行
  myDog.makeSound(); // 出力: ポチ: ワンワン!

  // 2. 子クラスで追加した独自のメソッドを実行
  myDog.fetch();     // 出力: ポチ はボールを取ってきた!
}

  • ​extends: (エクステンド)クラスを継承するときに使います。
  • ​super: (スーパー)親クラスのコンストラクタやメソッドを呼び出すときに使います。​一時的に親クラスへ受け取ったインスタンスを保存します。
  • @override: (オーバーライド)親クラスにあるメソッドを子クラス側で上書き定義するときにつけます(つけなくても動きますが、読みやすさとエラー防止のために書くのが推奨されています)。

superでメソッドを受け継ぐ場合

箇条書きでも書いたように親クラスのメソッドをsuperで受け継ぐことができます。その場合は以下のような書き方になります。

// 親クラス(ベースとなるクラス)
class Animal {
  String name;

  Animal(this.name);

  void makeSound() {
    print('$name が鳴いています。');
  }
}

// 子クラス(Animalを継承)
class Dog extends Animal {
  Dog(String name) : super(name);

  // 親クラスのメソッドを受け継ぎつつ拡張(オーバーライド)
  @override
  void makeSound() {
    // ① 親クラス (Animal) の makeSound() を実行する
    super.makeSound(); 

    // ② Dog独自の処理を追加する
    print('$name: ワンワン!');
  }

  void fetch() {
    print('$name はボールを取ってきた!');
  }
}

void main() {
  var myDog = Dog('ポチ');

  // super.makeSound() が入ったメソッドを実行
  myDog.makeSound();
}

書き方

class class名{
//プロパティ
//コンストラクタ
//メソッド
}
class 子class名 extends 親class名{
  // 親クラスのコンストラクタを呼び出す (super)
  // 親クラスのメソッドを書き換える(オーバーライド)
  // 子クラス独自のメソッドを追加
}
void main() {
  // 子クラスのインスタンスを作成
  // 1. 親から引き継いだメソッド(オーバーライドされた内容)を実行
  // 2. 子クラスで追加した独自のメソッドを実行
}

型を変換する

親クラスから受け継いだコンストラクタの型を変換したい場合は以下のようになります。

// 親クラス(ベースとなるクラス)
class Animal {
  String name;

  // コンストラクタ:String型のnameを受け取る
  Animal(this.name);
}

// 子クラス(Animalを継承)
class Dog extends Animal {
  // int型でdogIdを受け取り、
  // 文字列に変換して親クラス(Animal)のコンストラクタへ渡す
  Dog(int dogId) : super('ポチ$dogId号');
}

void main() {
  // 100 という数値を渡してDogインスタンスを作成
  var dog = Dog(100);

  // 親クラスから引き継いだ name を表示
  print(dog.name); // 出力: ポチ100号
}

新機能の情報

新しくDart(バージョン 2.17 以降)では、Super parameters という機能が追加されました。以下のコードでも動きます。

// 親クラス(ベースとなるクラス)
class Animal {
  String name;

  Animal(this.name);

  void makeSound() {
    print('$name が鳴いています。');
  }
}

// 子クラス(Animalを継承)
class Dog extends Animal {
  // 親クラスのコンストラクタを呼び出す (super)
  Dog(super.name);

  // 親クラスのメソッドを書き換える(オーバーライド)
  @override
  void makeSound() {
    print('$name: ワンワン!');
  }

  // 子クラス独自のメソッドを追加
  void fetch() {
    print('$name はボールを取ってきた!');
  }
}

void main() {
  // Dogクラスのインスタンスを作成
  var myDog = Dog('ポチ');

  // 1. 親から引き継いだメソッド(オーバーライドされた内容)を実行
  myDog.makeSound(); // 出力: ポチ: ワンワン!

  // 2. 子クラスで追加した独自のメソッドを実行
  myDog.fetch();     // 出力: ポチ はボールを取ってきた!
}
タイトルとURLをコピーしました