第6回 階層の頂点に立つクラス:連載 オブジェクト指向プログラミング超入門(1/3 ページ)
C#やVB.NETを使うのに必要なオブジェクト指向の知識を丁寧に解説。今回は継承のまとめとしてObjectクラスを中心に学ぶ。
Back Issue
1 | オブジェクトの正体 | |
2 | クラスの定義からプログラム実行まで | |
3 | Windowsアプリケーションの正体 | |
4 | 継承を使うために知っておくべきこと | |
5 | 継承を使わないとしても知っておくべきこと |
前回では継承によってもたらされるオブジェクト指向プログラミングの仕組みとして、派生クラスのオブジェクトは基本クラスのオブジェクトとして扱えるということを解説しました。
継承について知っておかなければならないもう1つの重要なポイントは、
「Objectクラスがすべてのクラスの基本クラスとなる」
という事実です(ObjectクラスはSystem名前空間に分類されています)。今回はクラス・ライブラリの頂点ともいうべきObjectクラスを中心に、継承について解説を進めていきます。
System名前空間のObjectクラス
前回でFormクラスは(間接的ですが)Controlクラスの派生クラスであることを見てきました。もう一度、Formクラスのクラス階層をリファレンス・マニュアルで見てみると、そのルート(根元)には「System.Object」というクラスがあることが分かります。
どのクラスの解説を見てもObjectクラスがルートになっていることが確認できます。また、リファレンス・マニュアルに記載されている分だけで、679個のクラスがObjectクラスの直接の派生クラスです(.NET Framework 1.1の場合)。
基本クラスを指定せずに定義したクラス
いま「Objectクラスはすべてのクラスの基本クラス」と述べましたが、基本クラスを指定せずに定義した自作のクラスはどういう位置付けになるのでしょうか。このような基本クラス指定のないクラスについては、次のような暗黙のルールがあります。
「基本クラスを指定していないクラスは、暗黙的にObjectクラスの派生クラスとなる」
つまり、次のようなクラスの定義は、
次のように、基本クラスとしてSystem.Objectを指定したのと同じになります。
このようなルールがあるため、すべてのクラスの基本クラスはObjectクラスである、別のいい方をすると、すべてのクラスはObjectクラスから派生している、という事実が成り立つわけです。
ちなみに、System.Objectクラスはこのように特別なクラスであるため、C#では単に「object」、VB.NETでは「Object」というキーワードで簡単に記述できるようになっています。これにより、上記のコードは次のように記述することもできます*1。
VB.NETのコードでは、System名前空間を参照するための「Imports System」を記述していないことに注意してください。
*1 objectやObjectというキーワードは、System.Objectクラスのエイリアス(alias、別名)です。C#やVB.NETのコンパイラは、これらのキーワードをクラス・ライブラリのSystem.Objectクラスに置き換えます。
すべてのクラスが持つObjectクラスのメンバ
すべてのクラスはObjectクラスの派生クラスであるため、Objectクラスのメンバを継承していることになります。Objectクラスにはプロパティはありませんが、5つのパブリックなメソッドがあります。これらのメソッドは、どんなオブジェクトに対しても呼び出すことができます。ここでは、その中でもToStringメソッドについて見てみましょう。
◆ToStringメソッド
ToStringメソッドは「オブジェクトを表す文字列」を返します。オブジェクトを表す文字列とは何かというと、Objectクラスでの実装では、そのオブジェクトの型を示す文字列となります。
例えば、次のようなコードでは「System.Object」という文字列が出力されます*2。
object obj = new object();
Console.WriteLine(obj.ToString());
// 出力「System.Object」
*2 このコードを記述したプロジェクトがコンソール・アプリケーションの場合には、コマンドプロンプトに出力されます。Visual Studio .NETからWindowsアプリケーションにより実行した場合には、[出力]ペインに出力されます。
ここで使用しているConsoleクラス(System名前空間に含まれています)の静的なメソッドであるWriteLineメソッドは、標準出力に対して文字列を出力するためのものです。C言語では、デバッグなどのメッセージを出力するのにprintf関数がよく用いられましたが、同じ目的でC#やVB.NETでは、このConsole.WriteLineメソッドがよく使われます。
話を戻しましょう。いくつかのクラスでは、ToStringメソッドをオーバーライドしていて、そのオブジェクトが持つインスタンス・データを整形して表示したりします。
図2 ToStringメソッドをオーバーライドするクラスの例
ObjectクラスではToStringクラスは仮想メソッドとして定義されており、その型を示す文字列を返すようになっている。このメソッドは任意のクラスでオーバーライドでき、クラス独自の文字列を返すことができる。
例えば、本連載でもよく利用しているFormクラス(System.Windows.Forms名前空間)のToStringメソッドは、型に続けて、そのウィンドウのタイトル(Textプロパティの内容)を返します。
Form f = new Form();
f.Text = "ウィンドウのタイトル";
Console.WriteLine(f.ToString());
// 出力「System.Windows.Forms.Form, Text: ウィンドウのタイトル」
日時を表すDateTimeクラス(正確にはDateTime構造体)では、日付と時間を整形して返します。
DateTime today = DateTime.Today;
Console.WriteLine(today.ToString());
// 出力例「2005/01/31 0:00:00」
各クラスのToStringメソッドは、デフォルトの動作として型を文字列として返すという機能を持っていますが、それを独自にカスタマイズできるということになります。もちろん、自作したクラスでも必要に応じてToStringメソッドをオーバーライドし、デバッグ用にフィールドの値を文字列として返すといったことができます。
Copyright© Digital Advantage Corp. All Rights Reserved.