自分で継承したクラスを書いてみると、初期についての理解が深まると思います。
実行可能なコードを書いてみたので、参考にしてください。コード内にコメントが記載されており、番号の順に初期化されます。
※DartPadでも実行可能。Flutterの場合、そのままでは動かないので、main()内に組み込んでお試しください。
なお、デバッカを使えば、ステップ実行すれば、処理順は確認できますので、実行してみるといいと思います、
void main() {
ChildClass(
'ParentArg',
'ChildArg',
parentNamedArg: 'ParentNamedArg',
childNamedArg: "ChildNamedArg",
);
}
class ParentClass {
String parentArg;
String parentNamedArg;
ParentClass(
// 3. thisが付いている引数は、メンバ変数に初期化する
this.parentArg, {
this.parentNamedArg,
}) {
// 4. 親クラスの初期化処理
print("[ParentClass.init]");
print(parentArg);
print(parentNamedArg);
}
}
class ChildClass extends ParentClass {
String childArg;
String childNamedArg;
ChildClass(
// 1. thisが付いている引数は、メンバ変数に初期化する
String parentArg,
this.childArg, {
String parentNamedArg,
this.childNamedArg,
}) : super( // 2. 親クラスに引数を渡して初期化
parentArg,
parentNamedArg: parentNamedArg,
) {
// 5. 子クラスの初期化処理
print("[ChildClass.init]");
print(parentArg);
print(parentNamedArg);
print(childArg);
print(childNamedArg);
}
}
(Q1)super以降の記載は、:以降がイニシャライザというものになるんでしょうか?
super
は親クラスのコンストラクタ(初期化)の呼び出しです。質問のコードでは、_MyInheritedWidget
の初期化処理はありませんが、super
の後に {}
を書いて初期化処理をかくこともできます(自分のコードには記載しました)
(Q2)もしYESであれば、このイニシャライザは何をしているのでしょうか。(言い換えると、keyとchildをスーパークラスに渡して何をしているのでしょうか)
super
は引数を親クラスに渡して、初期化を呼び出しています。
(Q3)同じくQ1でYESであれば、実行順序は、イニシャライザでkeyとchildの初期化後、引数にてkey, (@requiredの)child、(同じく@requiredの)dataという順番になるかと思いますが、keyとchildを2回初期化していることにはならないのでしょうか。(2回目:引数で渡している2引数で上書きしている?)
_MyInheritedWidget
は引数を親クラスInheritedWidget
に渡しているだけです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/02/21 06:22