前回で解説したとおり、オブジェクトは基本クラスのオブジェクトとして参照できます。そして、今回の冒頭で述べたように、Objectクラスはすべてのクラスの基本クラスです。よって、すべてのオブジェクトはObjectクラスのオブジェクトとして参照できます。つまり、どんなオブジェクトであってもObject型の変数に代入できます。
先ほどのWriteLineメソッドには、オーバーロードの1つとしてObject型のパラメータを取るバージョンも用意されています。このためWriteLineメソッドは任意のオブジェクトをパラメータに指定できます。
Object型のパラメータを取るWriteLineメソッドでは、パラメータに指定されたオブジェクトに対して、最終的にはToStringメソッドを呼び出して文字列を得るようになっています。このため、WriteLineメソッドを使用する場合には、実はわざわざToStringメソッドを呼び出してパラメータを文字列にする必要がありません。
先ほどの例として挙げたWriteLineメソッドの呼び出しも、次のように記述できます。
Console.WriteLine(obj.ToString()); → Console.WriteLine(obj);
Console.WriteLine(f.ToString()); → Console.WriteLine(f);
Console.WriteLine(today.ToString()); → Console.WriteLine(today);
Object型をパラメータとして取るWriteLineメソッドは、どのようなオブジェクトでもそれを文字列として出力できるようになっています。
Object型のパラメータを取るメソッドを持つクラスは、.NET Frameworkのクラス・ライブラリにはたくさんあります。その中でも代表的なものの1つは、コレクション・クラスです。
コレクション・クラスというのは、複数のオブジェクトを、オブジェクトのコレクション(集合)として管理するためのクラスです。.NET Frameworkのクラス・ライブラリで用意されている基本的なコレクション・クラスを次の表に示します。これらのクラスはすべてSystem.Collections名前空間に含まれています。
クラス名 | 内部データ構造 | オブジェクトを追加するメソッド |
---|---|---|
ArrayListクラス | 配列 | int Add(object value) |
Queueクラス | キュー | void Enqueue(object obj) |
Stackクラス | スタック | void Push(object obj) |
Hashtableクラス | ハッシュテーブル | void Add(object key, object value) |
System.Collections名前空間にあるコレクション・クラス(抜粋) これらのクラスは、複数のオブジェクトをオブジェクトのコレクション(集合)としてさまざまなデータ構造(配列、キュー、スタック、ハッシュテーブルなど)により管理する。 |
配列(System名前空間のArrayクラス)もコレクション・クラスの1つですが、配列はサイズ(格納可能なオブジェクトの数)を変更できないという点で、この表には含めていません。ArrayListクラスのデータ構造も配列ですが、内部で動的に配列の再割り当てを行うことにより、いくつでもオブジェクトをコレクションに追加できます。
コレクション・クラスのほとんどのクラスは、どのようなオブジェクトに対しても汎用的に使えるように、内部でオブジェクトをObject型として扱っています。ここでは、コレクション・クラスの中でも使用頻度の高いArrayListクラスについて見ていきます。
◆ArrayListクラス
ArrayListクラスは、複数のオブジェクトを配列として内部で保持します。コレクションへのオブジェクトの追加には、Addメソッドを用います。Addメソッドは内部配列の末尾にオブジェクトを追加します(Insertメソッドで指定した位置への挿入も可能です)。
次のサンプル・コードは、ArrayListクラスを利用した例です。1つのWebページ(HTMLファイル)を表すHTMLクラスと、リンク文字列(<A>タグにより記述される文字列とそのURL)を表すLinkクラスを想定しています。HTMLクラスのSetupメソッドは、渡されたHTMLファイルの内容を解析し、その中からリンク文字列を抜き出してLinkオブジェクトを作成し、ArrayListオブジェクト(変数links)によりコレクションとして保持するものとします。
さてここで、Setupメソッドの実行によりArrayListオブジェクトに集められたLinkオブジェクトから、1つのLinkオブジェクトを取り出す場合を考えてみましょう。
ここでは詳しくは解説しませんが、これにはC#では「インデクサ」、VB.NETでは「既定のプロパティ」の機能*3により、次に示すように、あたかも配列のようにArrayListオブジェクトから指定した位置にあるオブジェクトを取り出すことができます(インデクサおよび既定のプロパティの実装例は後述するサンプル・コードで示しています)。
*3 C#でのインデクサの定義は、コンパイラによりItemという名前のプロパティの定義となります。このItemプロパティはまた、コンパイラにより既定のプロパティとなります。VB.NETの場合、リファレンス・マニュアルではArrayListクラスの指定した位置の要素はItemプロパティにより取得できると記述されていますが、VB.NETでは、そのプロパティが既定のプロパティの場合には、プロパティ名を省略して(links.Item(0)をlinks(0)として)記述できます。
しかし、これによって得られるオブジェクトはLink型でなく、Object型となっています。ArrayListクラスの機能は、オブジェクトをObject型としてコレクションに追加し、単にそれをObject型として取り出すだけだからです。
このようにして得られた変数linkに対しては、このままでは先ほど述べたObjectクラスが持つ5つのメソッドしか使えません。そこで登場するのが「キャスト」です。
Copyright© Digital Advantage Corp. All Rights Reserved.