Menu
Coddy logo textTech

ゲッターとセッター

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

ゲッターとセッターは、通常のプロパティのように見える特殊なメソッドを通じて、クラスのフィールドにアクセスしたり変更したりする方法を提供します。フィールドを直接公開する代わりに、値がどのように読み書きされるかを制御できます。

ゲッターは、getキーワードを使用して定義され、計算された値または格納された値を返します:

class Rectangle {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  double get area => width * height;
  double get perimeter => 2 * (width + height);
}

Rectangle rect = Rectangle(5, 3);
print(rect.area);      // 15.0
print(rect.perimeter); // 16.0

areaperimeter はフィールドのようにアクセスされますが、これらは毎回計算されることに注目してください。括弧は不要です。

セッターset キーワードを使用し、値がどのように代入されるかを制御できるようにします:

class Temperature {
  double _celsius;
  
  Temperature(this._celsius);
  
  double get celsius => _celsius;
  set celsius(double value) {
    if (value >= -273.15) {
      _celsius = value;
    }
  }
  
  double get fahrenheit => _celsius * 9 / 5 + 32;
  set fahrenheit(double value) {
    celsius = (value - 32) * 5 / 9;
  }
}

Temperature temp = Temperature(25);
print(temp.fahrenheit);  // 77.0
temp.fahrenheit = 100;
print(temp.celsius);     // 37.78

セッターは、入力を保存する前に検証し、単位間の変換を行うことさえできます。これにより、クラスの利用者に対してクリーンでプロパティのような構文を維持しながら、データを制御できるようになります。

challenge icon

チャレンジ

簡単

バリデーションと計算された値を使用してプレイヤーの統計情報を管理するために、ゲッターとセッターを使用するゲームのスコアトラッカーを作成しましょう。

コードを2つのファイルに整理します:

  • player.dart: プレイヤーのゲームパフォーマンスを追跡する Player クラスを定義します。クラスには以下を含める必要があります:
    • プレイヤー名の String name フィールド
    • 0 で始まるプライベートな int _score フィールド
    • 3 で始まるプライベートな int _lives フィールド
    • プレイヤー名を受け取るコンストラクタ
    • 現在のスコアを返すゲッター score
    • 0 以上の値のみを受け入れるセッター score(負の値は無視します)
    • 現在のライフを返すゲッター lives
    • 0 から 5 の範囲(両端を含む)の値のみを受け入れるセッター lives(この範囲外の値は無視します)
    • スコアに基づいてプレイヤーのレベルを計算するゲッター level:スコアを 100 で割った値(整数除算)に 1 を加えたもの
    • ライフが 0 より大きい場合に true を返すゲッター isAlive
    • プレイヤーの現在のステータスを表示する displayStatus() メソッド
  • main.dart: プレイヤーのクラスをインポートし、ゲッターとセッターの動作を実演します:
    • 'Alex' という名前のプレイヤーを作成します
    • スコアを 250 に設定し、displayStatus() を呼び出します
    • スコアを -50 に設定しようとし(無視されるはずです)、displayStatus() を呼び出します
    • ライフを 1 に設定し、displayStatus() を呼び出します
    • ライフを 10 に設定しようとし(無視されるはずです)、displayStatus() を呼び出します

displayStatus() メソッドは、以下の形式で出力する必要があります:

[name] | Score: [score] | Level: [level] | Lives: [lives] | Alive: [isAlive]

期待される出力:

Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true

チートシート

ゲッターとセッターは、通常のプロパティのように見える特別なメソッドを通じて、クラスフィールドへの制御されたアクセスを提供します。

ゲッター (Getter) - get キーワードを使用して定義され、計算された値または保存された値を返します:

class Rectangle {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  double get area => width * height;
  double get perimeter => 2 * (width + height);
}

Rectangle rect = Rectangle(5, 3);
print(rect.area);      // 15.0 - フィールドのようにアクセスされ、括弧は不要
print(rect.perimeter); // 16.0

セッター (Setter) - set キーワードを使用し、値がどのように割り当てられるかを制御します:

class Temperature {
  double _celsius;
  
  Temperature(this._celsius);
  
  double get celsius => _celsius;
  set celsius(double value) {
    if (value >= -273.15) {
      _celsius = value;
    }
  }
  
  double get fahrenheit => _celsius * 9 / 5 + 32;
  set fahrenheit(double value) {
    celsius = (value - 32) * 5 / 9;
  }
}

Temperature temp = Temperature(25);
print(temp.fahrenheit);  // 77.0
temp.fahrenheit = 100;
print(temp.celsius);     // 37.78

セッターは、クリーンでプロパティのような構文を維持しながら、入力の検証や単位間の変換を行うことができます。

自分で試してみよう

import 'player.dart';

void main() {
  // TODO: 'Alex' という名前のプレイヤーを作成する

  // TODO: score を 250 に設定し、displayStatus() を呼び出す

  // TODO: score を -50 に設定してみて(無視されるはずです)、displayStatus() を呼び出す

  // TODO: lives を 1 に設定し、displayStatus() を呼び出す

  // TODO: lives を 10 に設定してみて(無視されるはずです)、displayStatus() を呼び出す
}
quiz icon腕試し

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

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