【Flutter/Dart】クラスの継承|extends/super/@override

クラス継承
スポンサーリンク

継承(Inheritance)とは?

継承

継承とは、別のクラス(親クラス)の機能を引き継いで、新しいクラス(子クラス)を定義することです。

継承を自動車に例えるなら、同じモデルの色違いの車が子クラスで、塗装がまだ終わっていない車が親クラスとなります。

>>【Flutter/Dart】クラスの基本 Part1|プロパティ/コンストラクタ/メソッド 

継承のメリット

継承することで、ベースとなる親クラスのプログラムの機能または変更を、全ての継承したクラスに反映できます。よって、複数のクラスで繰り返し使われるコードを別のクラスで定義しておき、新しいクラスで継承します。

継承の定義

親クラスのコンストラクタにパラメータがない場合

//定義
class 子クラス名 extends 親クラス名{}
//例
void main() {
  SportCar sport_car = SportCar();
  sport_car.childModel(); 
  sport_car.parentDrive(); 

}

//親クラスの定義(パラメータなしの場合)
class Car {
  void parentDrive() {
    print('I am driving');
  }
}

//子クラスの定義
class SportCar extends Car {
  void childModel() {
    print('It is a sport car');
  }
}

//出力
//It is a sport car
//I am driving

extendsを使って親クラスを継承します。また、継承したクラスは通常のクラス同様にインスタンス化でき、親クラス/子クラス両方のプロパティ/メソッドを使用できます。

親クラスのコンストラクタにパラメータがある場合

//定義
class 子クラス名 extends 親クラス名{
  子クラス名(子パラメータ): super(親パラメータ:子パラメータ) // 親クラスでキーワード引数を使う場合
}
//例
void main() {
  SportCar sportCar = SportCar(speed: 200, members: 6);
  print(sportCar.speed);
  print(sportCar.parentMembers);
}

//親クラスの定義(パラメータありの場合)
class Car {
  int parentMembers;
  Car({this.parentMembers}) {}
}

//子クラスの定義
class SportCar extends Car {
  int speed;
  SportCar({this.speed, int members}) : super(parentMembers: members) {}
}

//出力
//200
//6

親クラス引数を必要とする場合は、まず、子クラスのコンストラクタで親クラスの引数を受け取ります。次に「super」を使って親クラスのコンストラクタを呼び出し、受け取った引数を親クラスに渡します。(superについては次の項目で解説)

上の例では、子クラスのコンストラクタで親クラスの「parentMembersプロパティ」の引数となる値と、子クラスの「childSpeedプロパティ」の引数となる値を受け取るコンストラクタを定義しています。

>> 【Dart】関数の使い方|戻り値/引数/キーワード引数/アロー関数

super

superを使えば、親クラスのプロパティ/コンストラクタ/メソッドを子クラスで使用できます。

//例
void main() {
  SportCar sportCar = SportCar(members: 6);
  sportCar.childDrive(); 
}

//親クラスの定義
class Car {
  int parentMembers;
  Car({this.parentMembers}) {}

  void parentDrive() {
    print('I am driving');
  }
}

//子クラスの定義
class SportCar extends Car {
  //親クラスのコンストラクタを使用
  SportCar({int members}) : super(parentMembers: members) {} 

  void childDrive() {
    print(super.parentMembers); //親クラスのプロパティを使用
    super.parentDrive(); //親クラスのメソッドを使用
  }
}

//出力
//6
//I am driving

子クラスで親クラスのプロパティ/メソッドを使用するには、この例のように頭に「super.」をつけます。また、親クラスのコンストラクタの使用は先ほど解説した通りです。

「super=親クラス名」とイメージしておきましょう。

override

@overrideを使えば、クラスを継承する際、親クラスがもつメソッドを上書きすることができます。

//定義
class 子クラス名 extends 親クラス名{
  @override
  変更したい親クラスメソッド名(){
    (実行したい処理)
  }
}
//例
main() {
  SportCar sport_car = SportCar();
  sport_car.model();
}

//親クラスの定義
class Car {
  void model() {
    print('It is a family car.');
  }
}

//子クラスの定義
class SportCar extends Car {
  @override //親クラスの「modelメソッド」を上書き
  void model() {
    print('It is a sport car');
  }
}

//出力
//It is a sport car

親クラスのmodelメソッドを継承するクラスで上書きしています。

サンプルコード

//例
main() {
  SportCar sport_car = SportCar(doors: 4);
  print(sport_car.parentDoors);
  sport_car.model();
}

//親クラスの定義
class Car {
  int parentDoors;
  Car({this.parentDoors}) {}

  void model() {
    print('It is a family car.');
  }
}

//子クラスの定義
class SportCar extends Car {
  SportCar({int doors}) : super(parentDoors: doors) {}

  @override //親クラスの「modelメソッド」を上書き
  void model() {
    print('It is a sport car');
  }
}

//出力
//4
//It is a sport car

参考

A tour of the Dart language
A tour of all the major Dart language features.
タイトルとURLをコピーしました