ToString() のオーバーライド
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 38/70。
C#のすべてのクラスはobjectから継承されており、ToString()メソッドを提供しています。デフォルトでは、これは完全修飾型名を返しますが、オブジェクトの実際のデータを確認したい場合にはあまり便利ではありません。
ToString() をオーバーライドして、オブジェクトの分かりやすい文字列表現を返すことができます:
public class Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public override string ToString()
{
return $"{Name} ({Age} years old)";
}
}これで、Personオブジェクトをプリントしたり連結したりすると、読みやすい出力が得られます:
Person p = new Person("Alice", 30);
Console.WriteLine(p); // Alice (30歳)overrideなしでは、これはMyNamespace.Personのようなものを出力します。objectから継承されたメソッドを置き換えているため、overrideキーワードが必要です。これは、オブジェクトの状態を素早く把握する必要があるデバッグやロギングにおいて特に価値があります。
チャレンジ
簡単印刷時に意味のある文字列表現を提供し、デバッグや本の情報の表示をより直感的にする Book クラスを作成しましょう。
コードは2つのファイルに分けて構成します:
Book.cs:Library名前空間内に、本の主要な詳細を表すBookクラスを作成します。このクラスには以下のものを含める必要があります:- 3つの読み取り専用プロパティ:
Title(string)、Author(string)、Year(int) - タイトル、著者、出版年の順に引数を受け取るコンストラクタ
- フォーマットされた文字列
"{Title}" by {Author} ({Year})を返す、オーバーライドされたToString()メソッド
- 3つの読み取り専用プロパティ:
Program.cs: メインファイルで、入力値を使用してBookオブジェクトを作成し、それを直接印刷します。ToString()をオーバーライドしたおかげで、BookオブジェクトをConsole.WriteLine()に渡すと、型名の代わりにフォーマットされた情報が自動的に表示されます。
3つの入力を受け取ります:
- 本のタイトル (string)
- 著者名 (string)
- 出版年 (integer)
Console.WriteLine() を使用して、Book オブジェクトを直接印刷してください。
例えば、入力が The Great Gatsby、F. Scott Fitzgerald、1925 の場合、出力は以下のようになります:
"The Great Gatsby" by F. Scott Fitzgerald (1925)ここでのポイントは、ToString() を明示的に呼び出していないことです。オブジェクトを Console.WriteLine() に渡すと、自動的にそのオブジェクトの ToString() メソッドが呼び出されます。オーバーライドを行うことで、単に Library.Book と表示される代わりに、この便利な出力が得られるようになります!
チートシート
C#のすべてのクラスは object を継承しており、ToString() メソッドを提供しています。デフォルトでは、完全修飾型名を返します。
意味のある文字列表現を返すように ToString() をオーバーライドします:
public class Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public override string ToString()
{
return $"{Name} ({Age} years old)";
}
}オブジェクトを出力するとき、ToString() は自動的に呼び出されます:
Person p = new Person("Alice", 30);
Console.WriteLine(p); // Alice (30 years old)object から継承されたメソッドを置き換える場合、override キーワードが必要です。
自分で試してみよう
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// 入力を読み込む
string title = Console.ReadLine();
string author = Console.ReadLine();
int year = Convert.ToInt32(Console.ReadLine());
// TODO: 入力値を使用して Book オブジェクトを作成する
// TODO: Console.WriteLine() を使用して book オブジェクトを直接出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。