クラスの基本 (4/7)
作成:2018-04-14 08:31
更新:2018-04-14 08:31
更新:2018-04-14 08:31
■コンストラクタについて
先ほどのサンプルでは、MyObjインスタンスを作成後、nameとageの値を設定していました。が、これはちょっと面倒ですよね。どうせなら、newしたときに、必要な値を引数として渡せたほうがずいぶんと楽です。
こうした「インスタンス作成時の処理」を行う場合、とても便利な機能があります。それが「コンストラクタ」です。
コンストラクタは、newでインスタンスを作成する際に自動的に呼び出される、インスタンス初期化用の特別なメソッドです。これは以下のような形をしています。
下のリスト欄に、実際の利用例を挙げておきましょう。ここでは、MyObjクラスに以下のようなコンストラクタを用意してあります。
今回のようにコンストラクタを作成すると、今度は new MyObj(); というように引数なしでインスタンスを作ろうとするとエラーになってしまいます。コンストラクタを用意するまでは普通にできていたのに。なぜでしょう?
これは、コンストラクタを用意していないときは「デフォルトコンストラクタ」があったからです。デフォルトコンストラクタというのは、クラスにコンストラクタがない場合にDartが自動的に用意してくれる「引数のないコンストラクタ」のことです。これはスクリプトには見えません。書いてなくても、Dartが実行時に勝手に用意してくれるんです。このため、今ストラクが全く無いときもちゃんとnewでインスタンスが作成できていたんですね。
が。コンストラクタを追加すると、もうデフォルトコンストラクタは用意されなくなります。そのため、用意したコンストラクタ以外の引数でnewできなくなったのです。もし「引数なしで、new MyObj();でインスタンスを作れるようにしたい」と思ったなら、引数なしのコンストラクタを自分で用意する必要があります(これについては次のページで)。
こうした「インスタンス作成時の処理」を行う場合、とても便利な機能があります。それが「コンストラクタ」です。
コンストラクタは、newでインスタンスを作成する際に自動的に呼び出される、インスタンス初期化用の特別なメソッドです。これは以下のような形をしています。
クラス名 ( 引数 ){コンストラクタは、クラスと同じ名前のメソッドとして定義します。重要なのは「戻り値の指定がない」という点です(戻り値があると、普通のメソッドとして認識されます)。
……初期化処理……
}
下のリスト欄に、実際の利用例を挙げておきましょう。ここでは、MyObjクラスに以下のようなコンストラクタを用意してあります。
MyObj(String name, num age){Stringとnumの2つの引数を持ったコンストラクタですね。これらの引数で渡された値をそれぞれthis.nameとthis.ageに代入しています。では、このコンストラクタはどのように利用されているでしょうか。
this.name = name;
this.age = age;
}
MyObj taro = new MyObj('Taro', 35);こんな具合に、名前と年齢の値を引数に指定してインスタンスを作成できるようになりました。
MyObj hanako = new MyObj('Hanako', 28);
■デフォルトコンストラクタについて
今回のようにコンストラクタを作成すると、今度は new MyObj(); というように引数なしでインスタンスを作ろうとするとエラーになってしまいます。コンストラクタを用意するまでは普通にできていたのに。なぜでしょう?
これは、コンストラクタを用意していないときは「デフォルトコンストラクタ」があったからです。デフォルトコンストラクタというのは、クラスにコンストラクタがない場合にDartが自動的に用意してくれる「引数のないコンストラクタ」のことです。これはスクリプトには見えません。書いてなくても、Dartが実行時に勝手に用意してくれるんです。このため、今ストラクが全く無いときもちゃんとnewでインスタンスが作成できていたんですね。
が。コンストラクタを追加すると、もうデフォルトコンストラクタは用意されなくなります。そのため、用意したコンストラクタ以外の引数でnewできなくなったのです。もし「引数なしで、new MyObj();でインスタンスを作れるようにしたい」と思ったなら、引数なしのコンストラクタを自分で用意する必要があります(これについては次のページで)。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
void main() { MyObj taro = new MyObj('Taro', 35); taro.printData(); MyObj hanako = new MyObj('Hanako', 28); hanako.printData(); } class MyObj { String name; num age; MyObj(String name, num age){ this.name = name; this.age = age; } void printData(){ String re = '<MyObj "' + this.name + '"(' + this.age.toString() + ')>'; print(re); } }
※関連コンテンツ