【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part16 クラス

基礎 から 学ぶ Flutter 」という書籍で  学習 したことを ブログでアウトプットしていこうと思います。今回は Dart編 ( part16 )です。

前回

【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part15 クラス

クラスの学習の続きとなります。

クラス

継承

extendsキーワードを使用してクラスを継承することができます。
superを使用すると継承元のクラスのメソッドやフィールドにアクセスできます。
Javaと同じですね。

インスタンスメソッドをオーバーライドすることができます。
※本書ではちょくちょくゲッターとセッターを「メソッド」と区別して記載しているのですが意図があるのでしょうか?

オーバーライドする際、@overrideアノテーションを使用できます。
使用しなくてもオーバーライドとして機能します。

// 継承元
class Television {
  void turnOn() {
    print('テレビオン!');
  }
  void turnOff() {
    print('テレビオフ!');
  }
}

// 継承先
class SmartTelevision extends Television {
  // アノテーションを使用し明示的にオーバーライドできます。
  @override
  void turnOn() {
    print('テレビを華麗にオン♪');
  }
  // アノテーションを使用しなくても問題ありません。
  void turnOff() {
    print('テレビを華麗にオフ♪');
  }
  // 継承元の機能を呼び出す場合はsuperキーワードを使用します。
  void legacyTrunOn() {
    print('---親の動作呼び出し---');
    super.turnOn();
    print('---------');
  }
}

void main() {
  var a = SmartTelevision();
  a.turnOn();
  a.turnOff();
  a.legacyTrunOn();
}

 

オーバーライドするメソッドのパラメータについて、Dartではcovariantキーワードを用いることでサブタイプ(サブクラス?)の型に強制することができます。
これは面白い機能ですね。

class Animal {
  void chase(Animal x) {
    print(x.runtimeType);
  }
}

class Mouse extends Animal {}

class Cat extends Animal {
  // 継承元はAnimal型を許容していますが、
  // 継承先はAnimalのサブクラスをしています。
  @override
  void chase(covariant Mouse x ) {
    print(x.runtimeType);
  }
}

void main() {
  var a = Cat();
  a.chase(Mouse());
  
  // CatクラスのchaseではAnimalクラスを引数にすることはできません。
  //a.chase(Animal());
}

最後に

オブジェクト指向については多少勉強しているのでなんとか理解することができました。
covariantとはどのような使い道になるのでしょうかね?

今日はここまで!