Categories: Dart

【Dart】コンストラクタのデフォルト引数について

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}');    
ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago

【Unity】割合から数値に数値から割合に変換する

この記事では、割合から数値に変換する関数…

1年 ago