Dartのコンストラクタのデフォルト引数でハマったので備忘録として残しておく。
シンプルに引数内に書ける。
class Hoge {
Hoge([this.num = -1]);
int num;
}
// 名前付き
class Moge {
Moge({this.num = -1});
int num;
}
呼び出してみると以下のような感じ。
final h1 = Hoge();
final h2 = Hoge(0);
print('${h1.num}, ${h2.num}'); // -1, 0
final m1 = Moge();
final m2 = Moge(num: 0);
print('${m1.num}, ${m2.num}'); // -1, 0
定数でない場合は、Initializer list
を使う。
import 'dart:math' as math; // 乱数を使うため
class Hoge {
Hoge(): num = math.Random().nextInt(10);
int num;
}
あれ?これって引数指定できないじゃん...。
ということで次で実装。
オプショナル型を使って実装します。
class Hoge {
Hoge([this.num]){
// nullの場合にデフォルト値を渡す
num = num ?? math.Random().nextInt(10);
}
// オプショナル型
int? num;
}
// 名前付き
class Moge {
Moge({this.num}){
num = num ?? math.Random().nextInt(10);
}
int? num;
}
これで以下のように初期化できる。
final h1 = Hoge();
final h2 = Hoge(0);
final m1 = Moge();
final m2 = Moge(num: 0);
super
を使って親にアクセス。
class Parent {
Parent({this.parentNum}){
// nullの場合にデフォルト値を渡す(0 - 9)
parentNum = parentNum ?? math.Random().nextInt(10);
}
// オプショナル型
int? parentNum;
}
class Child extends Parent {
Child({super.parentNum, this.childNum}){
// 10 - 19 の乱数
childNum = childNum ?? math.Random().nextInt(10) + 10;
}
int? childNum;
}
以下のように呼び出せる。
var c1 = Child();
print('${c1.parentNum}, ${c1.childNum}'); // 0,10
var c2 = Child(parentNum: -1);
print('${c2.parentNum}, ${c2.childNum}'); // -1, 19
var c3 = Child(childNum: -2);
print('${c3.parentNum}, ${c3.childNum}'); // 7,-2
var c4 = Child(parentNum: -1, childNum: -2);
print('${c4.parentNum}, ${c4.childNum}');