Menu
Coddy logo textTech

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() は、開発中にオブジェクトの値を素早く確認できるようにすることで、デバッグを大幅に容易にします。

challenge icon

チャレンジ

簡単

各製品が印刷されたときに、その情報をクリーンで読みやすい形式で表示する製品カタログシステムを構築しましょう。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 の製品
    また、Laptop製品を使用して、製品の1つを含むメッセージ 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]
}
quiz icon腕試し

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

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