toString() のオーバーライド
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 70/110。
Dartでオブジェクトをプリントすると、Instance of 'Person'のように表示されることがありますが、これはあまり役に立ちません。これは、すべてのクラスがクラス名のみを返すデフォルトのtoString()メソッドをObjectから継承しているために起こります。
toString() をオーバーライドすることで、オブジェクトの分かりやすい文字列表現を提供できます:
class Person {
String name;
int age;
Person(this.name, this.age);
@override
String toString() {
return 'Person(name: $name, age: $age)';
}
}
void main() {
var person = Person('Alice', 30);
print(person); // Person(name: Alice, 30)
}オーバーライドしない場合、print(person) は Instance of 'Person' と出力されます。オーバーライドすることで、オブジェクトの状態に関する有用な情報を得ることができます。
toString() メソッドは、Dart がオブジェクトを文字列に変換する必要があるとき(print() 文、文字列補間、または他の文字列との結合時など)に自動的に呼び出されます。
var message = 'User: $person'; // toString() が自動的に呼び出される
print('Found: ' + person.toString()); // 明示的な呼び出し適切に実装された toString() は、開発中にオブジェクトの値を素早く確認できるようにすることで、デバッグを大幅に容易にします。
チャレンジ
簡単各製品が印刷されたときに、その情報をクリーンで読みやすい形式で表示する製品カタログシステムを構築しましょう。toString() メソッドをオーバーライドして、オブジェクトをよりデバッグしやすく、ユーザーフレンドリーにする練習をします。
コードを2つのファイルに整理します:
product.dart: 店舗のアイテムを表すProductクラスを作成します。製品にはname(String)、price(double)、およびquantity(int) を持たせる必要があります。toString()メソッドをオーバーライドして、次の形式でフォーマットされた文字列を返すようにします:Product(name: [name], price: $[price], qty: [quantity])main.dart: 製品ファイルをインポートし、toString()のオーバーライドによってオブジェクトの出力がいかに便利になるかを確認します。3つの製品を作成し、それらを出力してカスタム文字列表現が動作することを確認してください:- 名前が
'Laptop'、価格が999.99、数量が5の製品 - 名前が
'Mouse'、価格が29.5、数量が50の製品 - 名前が
'Keyboard'、価格が75.0、数量が30の製品
Featured: [product]を出力することで、文字列補間(string interpolation)も実演してください。- 名前が
各製品を直接出力すると、役に立たない Instance of 'Product' というメッセージではなく、意味のある情報が表示されることに注目してください。toString() メソッドは、print() 文の中や文字列補間を使用する際に自動的に呼び出されます。
期待される出力:
Product(name: Laptop, price: $999.99, qty: 5)
Product(name: Mouse, price: $29.5, qty: 50)
Product(name: Keyboard, price: $75.0, qty: 30)
Featured: Product(name: Laptop, price: $999.99, qty: 5)チートシート
デフォルトでは、Dartでオブジェクトをプリントすると Instance of 'ClassName' と表示されます。意味のある文字列を表現するために、toString() メソッドをオーバーライドします:
class Person {
String name;
int age;
Person(this.name, this.age);
@override
String toString() {
return 'Person(name: $name, age: $age)';
}
}toString() メソッドは、print() 文や文字列補間の中で自動的に呼び出されます:
var person = Person('Alice', 30);
print(person); // Person(name: Alice, age: 30)
var message = 'User: $person'; // toString() が自動的に呼び出されます自分で試してみよう
import 'product.dart';
void main() {
// TODO: 3つの Product インスタンスを作成します:
// 1. Laptop - price: 999.99, quantity: 5
// 2. Mouse - price: 29.5, quantity: 50
// 3. Keyboard - price: 75.0, quantity: 30
// TODO: 各製品を出力します(toString() が自動的に呼び出されます)
// TODO: 文字列補間(string interpolation)を使用しておすすめメッセージを出力します
// 形式: Featured: [laptop product]
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ11特殊メソッド
toString() のオーバーライドhashCode と == のオーバーライドComparable インターフェースcall() メソッドnoSuchMethod のオーバーライドまとめ:カスタムコレクション