Menu
Coddy logo textTech

名前付きコンストラクタ

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 のライブラリで一般的であり、自己文書化されたコードの作成に役立ちます。

challenge icon

チャレンジ

簡単

名前付きコンストラクタの威力を示す温度コンバータを作成しましょう。開始する単位に応じて、さまざまな方法で初期化できる 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() メソッドを追加します。
  • 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()を呼び出してください
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン