名前付きコンストラクタ
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 11/110。
名前付きコンストラクタを使用すると、クラスに対して複数のコンストラクタを作成でき、それぞれに目的を明確にする説明的な名前を付けることができます。これは、オブジェクトを初期化するさまざまな方法が必要な場合に特に便利です。
構文は、クラス名の後にドットとコンストラクタ名を続けます。
class Point {
int x;
int y;
// 通常のコンストラクタ
Point(this.x, this.y);
// 原点のための名前付きコンストラクタ
Point.origin() : x = 0, y = 0;
// 単一の値からの名前付きコンストラクタ
Point.diagonal(int value) : x = value, y = value;
}各名前付きコンストラクタは、オブジェクトを作成するための明確で読みやすい方法を提供します:
Point p1 = Point(3, 5);
Point p2 = Point.origin();
Point p3 = Point.diagonal(10);
print('p1: (${p1.x}, ${p1.y})'); // p1: (3, 5)
print('p2: (${p2.x}, ${p2.y})'); // p2: (0, 0)
print('p3: (${p3.x}, ${p3.y})'); // p3: (10, 10)名前付きコンストラクタを使用すると、コードがより表現力豊かになります。Point(0, 0) が何を意味するのかを推測する代わりに、Point.origin() を使うことでその意図が即座に伝わります。このパターンは Dart のライブラリで一般的であり、自己文書化されたコードの作成に役立ちます。
チャレンジ
簡単名前付きコンストラクタの威力を示す温度コンバータを作成しましょう。開始する単位に応じて、さまざまな方法で初期化できる Temperature クラスを作成します。
コードを2つのファイルに整理します:
temperature.dart:double celsiusインスタンス変数を持つTemperatureクラスを定義します。クラスには、温度を作成するための3つの方法を提供する必要があります:- Celsiusの値を直接受け取る通常のコンストラクタ
Temperature(this.celsius) - Fahrenheitの値を受け取り、次の式を使用してCelsiusに変換する名前付きコンストラクタ
Temperature.fromFahrenheit:(fahrenheit - 32) * 5 / 9 - 凝固点(摂氏0度)の温度を作成する名前付きコンストラクタ
Temperature.freezing()
[celsius]Cと出力するdisplay()メソッドを追加します。- Celsiusの値を直接受け取る通常のコンストラクタ
main.dart: 温度クラスをインポートし、3つの温度オブジェクトを作成します:25.0を使用した通常のコンストラクタによるもの98.6を使用したfromFahrenheitによるものfreezing()を使用したもの
display()を呼び出します。
期待される出力形式:
25.0C
37.0C
0.0Cチートシート
名前付きコンストラクタを使用すると、その目的を明確にする説明的な名前を持つ複数のコンストラクタをクラスに作成できます。
構文は、クラス名の後にドットとコンストラクタ名を続けます。
class Point {
int x;
int y;
// 通常のコンストラクタ
Point(this.x, this.y);
// 原点のための名前付きコンストラクタ
Point.origin() : x = 0, y = 0;
// 単一の値からの名前付きコンストラクタ
Point.diagonal(int value) : x = value, y = value;
}名前付きコンストラクタの使用例:
Point p1 = Point(3, 5);
Point p2 = Point.origin();
Point p3 = Point.diagonal(10);
print('p1: (${p1.x}, ${p1.y})'); // p1: (3, 5)
print('p2: (${p2.x}, ${p2.y})'); // p2: (0, 0)
print('p3: (${p3.x}, ${p3.y})'); // p3: (10, 10)名前付きコンストラクタは、意図を明確に伝えることで、コードをより表現力豊かにし、自己文書化を促進します。
自分で試してみよう
import 'temperature.dart';
void main() {
// TODO: 25.0を使用して、通常のコンストラクタでTemperatureを作成してください
// TODO: 98.6を使用して、fromFahrenheitでTemperatureを作成してください
// TODO: freezing()を使用してTemperatureを作成してください
// TODO: 各温度に対して順番にdisplay()を呼び出してください
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ