質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

2回答

2792閲覧

Flutter/Dartにおける、インスタンス化の際の挙動について

退会済みユーザー

退会済みユーザー

総合スコア0

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

1グッド

0クリップ

投稿2020/02/21 00:58

編集2020/02/21 00:59

Flutterでアプリを作成していますが、いつもWebの解説サイトにある以下のようなコードをあまり意味を理解せずにコピペしているので、きちんと理解したく質問させていただきました。

class _MyInheritedWidget extends InheritedWidget { _MyInheritedWidget({ Key key, @required Widget child, @required this.data, }) : super(key: key, child: child);

これはインスタンス化の際のコンストラクタ呼び出しの記述で、Key~this.dataまではMapによる名前付き引数を渡していると理解しています。

あまり理解できていないのはsuper以降です。(上も理解に誤りがあればご指摘いただきたいです)
(Q1)super以降の記載は、:以降がイニシャライザというものになるんでしょうか?
(Q2)もしYESであれば、このイニシャライザは何をしているのでしょうか。(言い換えると、keyとchildをスーパークラスに渡して何をしているのでしょうか)
(Q3)同じくQ1でYESであれば、実行順序は、イニシャライザでkeyとchildの初期化後、引数にてkey, (@requiredの)child、(同じく@requiredの)dataという順番になるかと思いますが、keyとchildを2回初期化していることにはならないのでしょうか。(2回目:引数で渡している2引数で上書きしている?)

よろしくお願い致します。

popobot👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

自分で継承したクラスを書いてみると、初期についての理解が深まると思います。
実行可能なコードを書いてみたので、参考にしてください。コード内にコメントが記載されており、番号の順に初期化されます。
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 03:49

編集2020/02/21 04:52
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/21 06:22

いつもご回答ありがとうございます。また、Dartpadについてご教示いただきありがとうございます。 もう少し手を動かしてからお尋ねすればよかったですね。申し訳ないです。 また、ご回答いただいた内容で理解できました。 やはり、イニシャライザが親を初期化してから子、という順番になるということですね。 ありがとうございました!
guest

0

Q1: そうです。厳密にはイニシャライズ・リスト(Initializer list)と言うそうです。

http://www.cresc.ne.jp/tech/java/Google_Dart2/language/classes/classes.html

Q2: 親クラスのコンストラクタを呼び出しています。

Q3: 私の認識ですと、1回目のものが親クラスの初期化、2回目が子クラスの初期化だと思いました。
http://www.cresc.ne.jp/tech/java/Google_Dart2/language/classes/classes.html#__RefHeading__63853_1385182067

投稿2020/02/21 01:47

hayato7

総合スコア1135

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/21 06:22

動かしてみて、ご認識のとおりのようです。 ご回答いただきどうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問