Menu
Coddy logo textTech

リダイレクトコンストラクタ

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 15/110。

リダイレクトコンストラクタは、同じクラス内の別のコンストラクタに処理を委譲します。フィールドを直接初期化する代わりに、別のコンストラクタを呼び出して処理を行います。これにより、複数のコンストラクタが同様のロジックを共有する場合に、コードの重複を避けることができます。

構文は、コロンの後に this とターゲットのコンストラクタを続けて記述します:

class Point {
  int x;
  int y;

  // メインコンストラクタ
  Point(this.x, this.y);

  // リダイレクトコンストラクタ - メインコンストラクタに委譲します
  Point.origin() : this(0, 0);

  // 別のリダイレクトコンストラクタ
  Point.onXAxis(int x) : this(x, 0);
}

Point.origin() を呼び出すと、実際の初期化を処理する Point(0, 0) にリダイレクトされます。リダイレクトコンストラクタは、ボディや初期化子リストを持つことはできません。単に別のコンストラクタに制御を渡すだけです。

Point p1 = Point(3, 5);
Point p2 = Point.origin();
Point p3 = Point.onXAxis(7);

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: (7, 0)

リダイレクトコンストラクタは、すべての初期化ロジックを1か所にまとめつつ、一般的なオブジェクト構成のための便利なショートカットを提供したい場合に便利です。後でオブジェクトの初期化方法を変更する必要が生じた場合でも、メインのコンストラクタを更新するだけで済みます。

challenge icon

チャレンジ

簡単

リダイレクトコンストラクタを使用して、時間オブジェクトを便利に作成できる時間表現システムを構築しましょう。

コードを整理するために、2つのファイルを作成します:

  • time_of_day.dart: 時と分を表す TimeOfDay クラスを定義します。クラスには以下のものを含める必要があります:
    • 2つのインスタンス変数:int hoursint minutes
    • hoursminutes の両方を受け取るメインコンストラクタ
    • 0:00の時間を生成するリダイレクトコンストラクタ TimeOfDay.midnight()
    • 12:00の時間を生成するリダイレクトコンストラクタ TimeOfDay.noon()
    • 指定された時間で0分の時間を生成するリダイレクトコンストラクタ TimeOfDay.atHour(int hour)
    • 時間を表示する display() メソッド
  • main.dart: 時間クラスをインポートし、4つの時間オブジェクトを作成します:
    • メインコンストラクタを使用した 9:30 のカスタム時間
    • midnight() コンストラクタを使用した深夜(0:00)
    • noon() コンストラクタを使用した正午(12:00)
    • atHour() コンストラクタを使用した 17:00 の時間
    上記の順序で、各時間に対して display() を呼び出します。

display() メソッドは、時と分を2桁にゼロパディングした、以下の正確な形式で出力する必要があります:

[HH]:[MM]

例えば、9時5分は 09:05 と表示される必要があります。

期待される出力:

09:30
00:00
12:00
17:00

自分で試してみよう

import 'time_of_day.dart';

void main() {
  // TODO: メインコンストラクタを使用して、9:30のカスタム時刻を作成してください

  // TODO: midnight() コンストラクタを使用して、深夜(0:00)を作成してください

  // TODO: noon() コンストラクタを使用して、正午(12:00)を作成してください

  // TODO: atHour() コンストラクタを使用して、17:00の時刻を作成してください

  // TODO: 上記の順序で、各時刻に対して display() を呼び出してください
}
quiz icon腕試し

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

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