🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Flutter

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

Dart

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

Q&A

解決済

2回答

2399閲覧

Flutter,Dart : factoryコンストラクタらしきものの文法的な意味について

moriman

総合スコア615

Flutter

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

Dart

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

0グッド

0クリップ

投稿2020/12/19 02:20

change_notifier.dartを見ていて、

abstract class Listenable { /// Abstract const constructor. This constructor enables subclasses to provide /// const constructors so that they can be used in const expressions. const Listenable(); /// Return a [Listenable] that triggers when any of the given [Listenable]s /// themselves trigger. /// /// The list must not be changed after this method has been called. Doing so /// will lead to memory leaks or exceptions. /// /// The list may contain nulls; they are ignored. factory Listenable.merge(List<Listenable?> listenables) = _MergingListenable;

というのが出てきました。最後のfactoryキーワードがついている部分なんですが、これは
factoryコンストラクタなのでしょうか?
コンストラクタの定義なのでしょうか?

代入されている_MergingListenableに関しては、

class _MergingListenable extends Listenable { _MergingListenable(this._children); final List<Listenable?> _children; @override void addListener(VoidCallback listener) { for (final Listenable? child in _children) { child?.addListener(listener); } } @override void removeListener(VoidCallback listener) { for (final Listenable? child in _children) { child?.removeListener(listener); } } @override String toString() { return 'Listenable.merge([${_children.join(", ")}])'; } }

上記のように定義されており、普通のクラスです。
上記のfactoryコンストラクタ?の書き方が初見で意味がよくわかりません。
公式ドキュメントかどこかに説明ってありますでしょうか?
一応公式ドキュメントのコンストラクタ付近は目を通したつもりです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ご質問のものはファクトリコンストラクタです。
リダイレクトという操作です。

ファクトリコンストラクタは以下のような記法で、そのクラスになれるクラスのコンストラクタにリダイレクトができます。

dart

1class MyClass { 2 const MyClass({this.value}); 3 final String value; 4 factory MyClass.myCon2({String value}) = MyClass2; // これはFactoryコンストラクタであり、指定したサブクラスのデフォルトコンストラクタにリダイレクトする 5 6 factory MyClass.myCon3({String value}) = MyClass3.myCon3; // これはFactoryはコンストラクタであり、指定したサブクラスの指定したファクトリコンストラクタにリダイレクトする 7} 8 9class MyClass2 extends MyClass { 10 const MyClass2({String value}) : value = 'MyClass2:$value'; 11 12 13 final String value; 14} 15 16class MyClass3 extends MyClass { 17 MyClass3._({this.value}); 18 factory MyClass3.myCon3({String value}) => MyClass3._(value: 'MyClass3:$value'); 19 20 21 final String value; 22} 23 24void main() { 25 // (new) MyClass MyClass({String value}) 26 MyClass m1 = MyClass(value: "hoge"); 27 print(m1.value); 28 // (new) MyClass MyClass.myCon2({String value}) 29 MyClass m2 = MyClass.myCon2(value: "hoge"); 30 print(m2.value); 31 // (new) MyClass MyClass.myCon3({String value}) 32 MyClass m3 = MyClass.myCon3(value: "hoge"); 33 print(m3.value); 34 35 // おまけ:個人的にはできちゃ駄目だとおもうけど、以下も特にエラーにはならない 36 MyClass2 mm2 = MyClass.myCon2(value: "hoge"); 37 print(mm2.value); 38 MyClass3 mm3 = MyClass.myCon3(value: "hoge"); 39 print(mm3.value); 40}

引数と型さえ合っていれば、コンストラクタとみなされる型の関数をfactoryコンストラクタに代入するように指定ができます。
myCon3のように、factoryコンストラクタにfactoryコンストラクタを渡すこともできます。

投稿2020/12/28 08:43

編集2021/01/19 07:04
aya-eiya

総合スコア97

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

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

aya-eiya

2020/12/28 08:45

コンストラクタとはいえ単なる関数で、クラスの(静的な)メンバーなので、型が合っていれば代入が可能だという気楽な理解で良いと思います。
moriman

2021/01/10 03:06

回答をいただきましてありがとうございました。 これってただ関数を代入している、ということなんですね。 引数と型さえ合っていれば、コンストラクタとみなされる型の関数をfactoryコンストラクタに代入するように指定ができます。 myCon3のように、factoryコンストラクタにfactoryコンストラクタを渡すこともできます。 ↑の部分は公式ドキュメントなどどこかに説明ってありましたでしょうか。
aya-eiya

2021/01/11 11:57

https://dart.dev/guides/language/specifications/DartLangSpec-v2.2.pdf 10.6 Constructors ,10.6.2 Factories あたりの定義から演繹できると思います。 > A redirecting factory constructor q' is redirection-reachable from a redirecting factory constructor q iff q' is the redirectee constructor of q, or q'' is the redirectee constructor of q and q is redirection-reachable from q''.
moriman

2021/01/12 03:11

ありがとうございました。
guest

0

公式ではないですが、
https://qiita.com/takyam/items/f6a895b873241ce937fb

他にもdart factory constructorでググったらチラホラ出てきましたよ

投稿2020/12/23 01:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

moriman

2020/12/23 02:04

回答を頂きましてありがとうございます。 求めているものは一般的なfactoryコンストラクタの文法の解説ではなくて、 factory Listenable.merge(List<Listenable?> listenables) = _MergingListenable; 上記の書き方の解説でした。 質問がはっきりしていなくても申し訳ございませんでした。
退会済みユーザー

退会済みユーザー

2020/12/23 02:07 編集

いえ、ちゃんとみれてませんでした。そのことを自分の回答にコメントしようとしたら間違って、また別の回答をしてしまいました。そちらは削除リクエストしましたが、荒らしみたいになってすいません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問