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

クラスの基本 (5/7)

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

■名前付きコンストラクタ

「デフォルトコンストラクタがなくなったら、自分で引数なしのコンストラクタを用意しないといけない」といいましたが、これは実は意外と難しいんです。例えば、こんな具合にクラスを作ったとしましょう。
class MyObj {
  String name;
  num age;
  
  MyObj(){
    this.name = 'noname';
    this.age = 0;
  }
  
  MyObj(String name, num age){
    this.name = name;
    this.age = age;
  }
  ……略……
}
これは、エラーになります。「同じ名前のメソッドが複数ある」ためです。Dartでは、クラスの中に同じ名前のメソッドを複数置くことはできません。

まぁ、普通のメソッドなら、名前を変えればいいんですが、コンストラクタはそうもいきません。名前を変えたらコンストラクタじゃなくなってしまいますから。そこで考え出されたのが「名前付きコンストラクタ(named constructor)」というものです。

これは、コンストラクタメソッドに名前をつけたもので、こんな具合に記述します。
クラス名.名前 ( 引数 ){
    ……略……
}
コンストラクタはクラス名のメソッドですが、クラス名の後に更に名前をつけることで、別のコンストラクタを用意できるようにしたのですね。

下のリスト欄に、実際の利用例を挙げておきます。ここでは、以下の2種類のコンストラクタを用意してあります。
MyObj()
MyObj.make(String name, num age)
これで、new MyObj() とすれば引数なしのコンストラクタが呼び出されますし、new MyObj.make(○○,××) とすれば、MyObj.makeコンストラクタが呼び出されるようになる、というわけです。


■リダイレクトについて

ところで、ここでは引数なしのコンストラクタを定義するとき、ちょっと変な書き方をしていますね。これです。
MyObj() : this.make('noname', 0);
普通は、()の後に{}をつけて、そこに処理を記述するはずです。が、{}がなくて、:の後に this.make('noname', 0); とmakeコンストラクタを呼び出しています。

これは、「リダイレクト」という機能を利用したものです。コンストラクタは、引数を付けたものをいくつも用意することがありますが、「引数が異なるだけで、やることは全部いっしょ」ということもよくあります。そんな場合に、「このコンストラクタは、こっちのコンストラクタを呼び出すだけでOK」というのを指定するのが、リダイレクトです。

リダイレクトは、コンストラクタの()の後に : をつけ、その後にリダイレクト先となるコンストラクタの呼び出し文を記述します。上の例ならば、これで MyObj() と実行すると、this.make('noname', 0) が呼び出されるようになります。

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

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

●プログラム・リスト●

void main() {
  MyObj taro = new MyObj.make('Taro', 35);
  taro.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);
  }
  
}

※関連コンテンツ

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