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

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

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

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

Q&A

解決済

1回答

3066閲覧

MyHomePage({Key key, this.title}) : super(key: key);のコードがわかりません

mako_0221

総合スコア87

Dart

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

0グッド

0クリップ

投稿2022/05/06 02:18

不明点

以下のコードのうち MyHomePage({Key key, this.title}) : super(key: key);の理解に躓いてしまいました。

Dart

1class MyHomePage extends StatefulWidget { 2 MyHomePage({Key key, this.title}) : super(key: key); 3 final String title; 4 5 6 _MyHomePageState createState() => _MyHomePageState(); 7}

公式ドキュメンテーションによれば、superに関しては、以下の通りの記載があり

If the superclass doesn’t have an unnamed, no-argument constructor, then you must manually call one of the constructors in the superclass. Specify the superclass constructor after a colon (:), just before the constructor body (if any).

スーパークラスのコンストラクタの手動による呼び出しについて触れられております。(逆にsuperに関する説明はその程度しか記載がないように思えます)

実際に MyHomePage({Key key, this.title}) : super(key: key);を観察してみると、公式にあるようなsuperの使い方とは異なり、スーパークラスのコンストラクタの手動での呼び出しとは異なるようにも思えます。

一方、オリジナルコード出典もとのQiita記事によれば、このsuper を含めた MyHomePage({Key key, this.title}) : super(key: key);はリダイレクトコンストラクタであると記載がありました。ただ、公式ドキュメンテーションにはリダイレクトコンストラクタの文脈におけるsuperの利用については何も触れられておりません。

ご質問

これらを踏まえて、 MyHomePage({Key key, this.title}) : super(key: key);はどのように理解すればよいのでしょうか?
Qiita記事ではこれはリダイレクトコンストラクタで親にもkeyを渡していると言うような説明をざっくりされていますが、特に公式のリダイレクトコンストラクタには:が2度も出てこないため、混乱しております。。

Dart

1//a Tour of Dart Language #redirect part 2class Point { 3 double x, y; 4 5 // The main constructor for this class. 6 Point(this.x, this.y); 7 8 // Delegates to the main constructor. 9 Point.alongXAxis(double x) : this(x, 0); 10}

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • (パラメータ名:値)というように引数の中で使われるコロンは、メソッド定義時に{}で囲まれているもので、named parametersというものです。
  • パラメータの後ろの() : のコロンの後ろはInitializer Listsと呼ばれるものでオブジェクト生成時に変数等を初期化する場合に記述する場所です。
  • superはその名の通りsuperclassの変数等の呼び出しで、super()はsuperclassのコンストラクタの呼び出しをします。

これを踏まえMyHomePage({Key key, this.title}) : super(key: key);は以下の様に解釈できるでしょう。

  • MyHomePageのコンストラクタでは、keyとリストいう名称でKeyクラス、titleという名称でStringを受け取ることを可能としている。
  • MyHomePageのコンストラクタでオブジェクトを生成する際、superclassここではStatefulWidgetですが、このコンストラクタにMyHomePageのコンストラクタで受け取ったkeyを渡し初期化している。

どちらにもコロンが利用されていますが、それぞれは別々の意味のものを表しています。

またPointの方は、コンストラクタの引数に{}が使われていないので()内でnamed parametersを使用していないだけです。

MyHomePage({Key key, this.title}) : super(key: key);はエラーになりませんか。

MyHomePage(this.title, {Key? key}) : super(key: key);が正しいような気がしますが。

投稿2022/05/06 06:18

ta.fu

総合スコア1667

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

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

mako_0221

2022/05/06 07:15

コメントをいただき、ありがとうございます。 MyHomePage({Key ①key, this.title}) : super(②key: ③key); 1. super(key: key)における:はnamed parametersでありいわゆる名前付きパラメータとして、③keyを指定することで、スーパークラス(ここではStatefulWidget)の②key(名前付)パラメータにKey型の①keyを渡しなさいと言う意味である 2また、MyHomePage() : super()におけるコロンは初期化リスト(Initializer Lists)である と言うように理解しました。 少し違和感があるのが他の記事では2番目のコロンはリダイレクトコンストラクタを使うための記法と言う説明が多かったのですが、これは正しくはないと言うことでしょうか? 初期化リストのドキュメントを見ると「コンストラクタ本体が実行される前にインスタンス変数を初期化するために用いられる」と言う記載があり、今重ねて読み返しても、コンストラクタのリダイレクトと初期化リストが具体的にどのように違いがあるのか、正しく理解はできていないのですが、今回のコロンが初期化リストのためのコロンであればこの文脈ではそのように理解いたします。 MyHomePage({Key key, this.title}) : super(key: key);はnull safetyではエラーとなります。ご指摘ありがとうございます。
ta.fu

2022/05/06 07:49

他の記事がどの記事のことをいって言っているのか不明ですが、正しいのはDartの仕様書であり、それを簡略化して記述されている https://dart.dev/ 内の文書です。 そこに書かれているRedirecting constructorsには、コンストラクタにbodyがなく同一クラス内のコンストラクタをthisを付けてコロン(:)の後ろに記述することだと書かれています。 ちなみにコロン(:)が使われるところはいくつかあります。それぞれの場所で利用形態、呼び名が変わります。 Optional Formals、Redirecting Generative Constructors、Initializer Lists、Collection Literals、 Conditional、Switch、Labelsと7か所でコロン(:)が利用されると定義されています。 今回の件だと、Optional Formals、Redirecting Generative Constructors、Initializer Listsを混同してしまったということになると思います。
mako_0221

2022/05/06 13:29

ありがとうございます。 記事とは文中の「オリジナルコード出典もとのQiita記事」の記事でございます。 いずれにしても、今回のコロンはそれぞれ、名前付パラメータとInitializer Listsと言うことで理解いたしました。 特にInitializer Listsの利用場面や正しい記法については、tourではイマイチ理解に至らなかったため、もう少し違う記事や書籍で調べてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問