ゲッターとセッター
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.0area と perimeter はフィールドのようにアクセスされますが、これらは毎回計算されることに注目してください。括弧は不要です。
セッターは 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セッターは、入力を保存する前に検証し、単位間の変換を行うことさえできます。これにより、クラスの利用者に対してクリーンでプロパティのような構文を維持しながら、データを制御できるようになります。
チャレンジ
簡単バリデーションと計算された値を使用してプレイヤーの統計情報を管理するために、ゲッターとセッターを使用するゲームのスコアトラッカーを作成しましょう。
コードを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() を呼び出す
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ