libro
www.tuyano.com
初心者のためのDart 2入門

クラスの基本 (7/7)

作成:2018-04-14 08:37
更新:2018-04-14 08:37

■オーバーライドについて

このMyDataクラスには、継承元のMyObjにあったprintDataメソッドが追加されています。このように、継承したクラスで、継承元にあったメソッドとまったく同じものを用意すると、継承元のメソッドは呼び出されなくなります。例えばこの例なら、MyDataクラスのインスタンスを作成し、printDataメソッドを呼び出すと、MyDataにあるprintDataが呼び出され、MyObjのprintDataは使われなくなります。

このように、「継承したクラスに同じメソッドを置くことで、メソッドを上書きすること」を、オーバーライドといいます。

オーバーライドしたメソッドは、その手前に @override というものを記述しておきます。この@で始まる文は「アノテーション」と呼ばれるもので、メソッドなどに特定の性質を割り当てたりするのに利用されます。@overrideは、そのメソッドがオーバーライドされたものであることを示します。


■「super」について

サブクラスでは、スーパークラスのインスタンスにあるメソッドなどを呼び出すことができます。これは「super」というものを利用します。例えば、スーパークラスにあるprintDataを呼び出したければ、
super.printData();

こんな具合に実行すればいいのです。

メソッドをオーバーライドする場合、スーパークラスにあるメソッドを上書きして呼び出さなくなってしまいます。「スーパークラスにあるメソッドに、更にちょっとした機能を付け足したい」というとき、スーパークラスにある処理をサブクラスでまたずらずら書くのはバカげています。こういうとき、superを利用するのです。
void printData(){
    super.printData();
    ……追加する処理……
}
例えば、こんな具合にすれば、スーパークラスにあるprintDataを実行してから更に追加の処理を実行できます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

void main() {
  MyObj taro = new MyObj.make('Taro', 35);
  taro.printData();
  MyData hanako = new MyData.make('Hanako', 'hanako@flower', 28);
  hanako.printData();
}

class MyObj {
  String name;
  num age;
  
  MyObj() : this.make('noname', 0);
  
  MyObj.make(String name, num age){
    this.name = name;
    this.age = age;
  }
  
  void printData(){
    String re = '<MyObj "' + this.name + '"(' + this.age.toString() + ')>';
    print(re);
  }
  
}

class MyData extends MyObj {
  String mail;
  
  MyData() : this.make('noname', 'no@mail', 0);
  
  MyData.make(String name, String mail, num age){
    this.name = name;
    this.mail = mail;
    this.age = age;
  }
  
  @override
  void printData(){
    String re = '<MyObj "' + this.name + ' [' + this.mail + '"](' + 
          this.age.toString() + ')>';
    print(re);
  }
}
※関連コンテンツ

「初心者のためのDart 2入門」に戻る