|
VB.NET C# インターフェースの基本 |
|
インターフェースとは
最近のパソコンには必ずUSBのコネクタが付いています、USBのコネクタには様々な周辺機器が接続されます。
メモリやプリンタはもちろんの事扇風機や事によれば電気で保温される膝掛けまで有ります。 この様な周辺機器はUSBの仕様書に基づいて作られています。 仕様書の中で他の機器との接続部分をインターフェースと呼ぶ事が有ります。 USBの仕様書のインターフェス部分にはどの様なコネクタを使用するのか、 コネクタの何番ピンに何ボルトの電源が接続しているなどの情報が書かれています。 .NET Frameworkのインターフェースもこれに似ています。 Sortメソドを使ったインターフェースの説明
ArrayクラスはSortと言うメソドを持っています、これを使用したコードサンプルを御覧下さい。C# コード
static void Main(string[] args)実行結果は1、4、7と表示されます。 このSortというメソドはArrayクラスに格納されているデータを有る規則に従って並べ替えます。 例えばArrayクラスに文字列が格納されている場合はSortメソドを実行すると文字は大文字小文字を 無視して、Asciiコード順にソートされます。 Arrayクラスに数値が格納されている場合は、数値の小さい順にソートされます。 では文字列を大文字小文字を区別してソートするにはどの様にするのでしょうか? 又数値を降順にソートするには? 更に自分の好きな様にソートしたいと考えるかもしれません。 この様な色々なソートを実現する為にはソートの方法をその使用者に任せてしまえばいいのです。 ソートは本来2つの値を比較して小さい方を前に大きい方を後ろに設定します。 つまりソートとは2つの値の比較と再配置の繰り返しです。 そこでこの比較の方法をSortの使用者に開放してしまえば良いことになります。 インターフェースの定義
ではStringクラス又はIntegerクラスが持つSortメソドの2つの値の比較メソドを書き換えるにはどの様なことをすればよいのでしょうか? この方法を提供するのがインターフェースで、インターフェースは次の様に書かれます。 (実際はこのコードはコモン・ランタイム・モジュール CLRの中に書かれており、この通りではないかも知れません。) C# コード
interface IComparableこれはIcomparableインターフェースはComparareToメソドを持ち、このCompareToメソドは1つのobjectの 引数を持ち、Integerの値を返すと言う意味です。 そしてこのメソドのCompareToが大小比較の為のメソドとなります。 しかしながらCompareToが一体何をするかは全く書かれていません(実装がなされていません)。 それは使用者が自由に書きなさい(実装しなさい)ということなのです。 インターフェースを持つクラスの記述
さてこのインターフェースを持つクラスはどの様に記述するのでしょうか?C# コード
class intArray : IComparableこの様にクラス後ろに続けてコロン(:)とインターフェース名を書きます、インターフェースはピリオド(,)で区切って 幾つでも指定出来、そしてこのことをインターフェースを実装すると言います。 インターフェースの名前は自由ですが慣例として頭に大文字の「I」をつけることになっています。 ここで重要なルールが有ります、インターフェースを実装した場合は必ず其のインターフェースが規定するメソド この場合はCompareToを実装する必要が有ります。 もし実装を忘れるとコンパイラーがエラーを報告します。 インターフェースのメソドの実装
実際にこのクラスにCompareToを実装してみましょう。Sortメソドが呼び出すComareToは引数と自分を比較して自分が小さければ負の値を、同じならば0を 自分が大きければ正の値を返します。 SortはComareToを呼び出して負の値が返ったら自分を前に、同じなら何もせずに、正の値が返ったら、 自分を後ろにします、intArrayクラスに実装するCompareToは其のことを念頭に入れて実装します。 C# コード
//内部にIntegerの値を持つクラス実はこのコードの説明は面倒です、一応は説明しますがSortに関してはもう少し簡単な方法が有りこれは 後に説明しますので、このコードの説明が難しい場合は読み飛ばして下さい。 (ここで重要なのはソートの比較方法はIComparableインターフェースのComapreToメソドの比較方法に 拠るという事を理解することです。) intArrayクラスは、内部にInteger型のフィールドivalueを持ちます。 このivalueはこのクラスのインスタンスが作成される時に、コンストラクタの引数としてセットされます。 さてComapreToは引数にobjectを取り、このobjectと自分自身つまりivalueを比較します。 int inewvalue = ((intArray)obj).ivalue; は渡されたobjectから比較されるInteger型の値を抽出しています。 渡されてきたInteger型の値が得られたら後は簡単です。 return (ivalue - inewvalue); ivalueは自分の値でinewvalueは比較される値です、これで自分が小さければ負の値が、 同じならば0が自分が大きければ正の値が返されます。 IConparableインターフェースを持つクラスを使用したソート例
ではIConparableインターフェースを持つクラス、intArrayクラスを使ってSortのコードを書き換えて見ます。C# コード
static void Main(string[] args)結果は一番上のコードと同じ1、4、7と表示されます。 では今度は、intArrayクラスの return (ivalue - inewvalue);を return ( inewvalue-value ); と書き換えて見ます、実行結果は7,4,1となります。 つまり引数と自分の大小比較を書き換えれば好きな様にソートが出来ると言うことです。 例えば4を必ず先頭に来るようにソートする場合は C# コード
//CompareToの実装CompareToを上の様に書き換えれば良いことになり、実行結果は4、7、1となります。 IntegerクラスもStringクラスもIComparableクラスを実装している
さてここでもう一度一番最初のコードを見て戴きたい。Array.Sort(intArry); でソートを行なっています、IntegerクラスはもともとIComparableインターフェースを実装しており 当然CompareToメソドを実装していて、Sortメソドはそれを使ってソートを行なっているのです。 Arrayクラスの持つインターフェース
ArrayクラスのSortメソドには幾つかのオーバーライドが有り、様々な引数が設定できますが、ここではArrayクラスを引数に持つものと、ArrayクラスとIComparerを引数に持つものを表示しています。
1番目の方法は既に説明済みで、引数に自分と比べるobjectを渡したものです。
比較は IComparableインターフェースのcompareToメソドが使用されています。 この方法は比べる自分をクラスの中で保持する必要が有り、数値や文字列の比較には面倒です。 インターフェース IComparerの使用
2番目の方法は引数にソートするArrayとインターフェースのIComparerを指定する方法です。IComparerインターフェースのCompareメソドは、2つのObjectの引数を取り、Integerの値を返します。 下のコードはmyCompareと言うクラスを宣言し、CLRが持つIComparerインターフェスを実装させています。 メソドCompareは比べる対象をIntger型の引数に限定して、始めの引数が小さければ負の値を 大きければ正の値を、同じなら0を返します。 C# コード
//IComparer クラスのComparメソドの実行呼び出す方のコードは以下の様になります。 C# コード
class Programソートの方法は return ((int)x-(int)y); の部分を書き換えることにより自由に決めることが出来ます。 return ((int)y-(int)x); とすることで、ソートが降順になることを確かめて下さい。 この方法の方がIComparableインターフェースのCompareToメソドを使用するよりコードが直感的で 簡単になります。 以上この章ではインターフェースを.NET Frameworkが持つIComparableインターフェースと IComparerインターフェースを使って説明しましたが、インターフェースは自由に設定出来ます。 又インターフェースはメソドだけではなく、プロパティやインデクサを設定することも可能です。 |