画像ファイル
画像ファイル VB.NET C# インターフェースの基本
VB.NET C#全般
1羊の皮を着た狼 VB.NET
2Form1、Form2の相互参照
3Form1、Form2の相互参照 2
4VB.NET C# データ型の基本
5VB.NET C# 文字列
6VB.NET タイマー精度
7BackgroundWorkerの魅力1..
8BackgroundWorkerの魅力2..
9VB6のタイマー
10コントロールの配列をインデクサ..
11コントロールの配列はジェネリク..
12インデクサ(C#、VB.NET)
13インデクサでBit操作
14Unicode 入門
15デリゲート入門
16マルチスレッド入門
17イベント入門
18デリゲートとイベント
18インターフェースの基本

RichTextBox関係
1RichTextBoxの不思議
2テキスト色付け高速化計画
3VB.NET RichTextBox1
4VB.NET RichTextBox 2

RS-232C関係
1RS-232Cの基礎
2RS-232Cの何が変わった..
3SerialPortクラス
4Unicode(ユニコード)の壁
5マルチスレッドの壁
6RS-232C サンプルコード
7RS-232CのHEXモニタ
8RS-232C 送信モジュール
9RS-232Cのループテスト
10RS-232Cのピンチェンジ..

Socket通信
1C#、VB2005 でSocket通信
2サーバー 複数接続

プロセス間通信
1プロセス間通信(送信側)
2プロセス間通信(受信側)


質問、意見はこちらに
画像ファイル

インターフェースとは
最近のパソコンには必ずUSBのコネクタが付いています、USBのコネクタには様々な周辺機器が接続されます。
メモリやプリンタはもちろんの事扇風機や事によれば電気で保温される膝掛けまで有ります。
この様な周辺機器はUSBの仕様書に基づいて作られています。
仕様書の中で他の機器との接続部分をインターフェースと呼ぶ事が有ります。
USBの仕様書のインターフェス部分にはどの様なコネクタを使用するのか、
コネクタの何番ピンに何ボルトの電源が接続しているなどの情報が書かれています。
.NET Frameworkのインターフェースもこれに似ています。

Sortメソドを使ったインターフェースの説明
ArrayクラスはSortと言うメソドを持っています、これを使用したコードサンプルを御覧下さい。
C# コード
static void Main(string[] args)
{
int[] intArry = { 1, 7, 4 };
Array.Sort(intArry);

for (int i = 0 ; i < intArry.Length; i++)
Console.WriteLine(intArry[i].ToString());
Console.Read();
}
実行結果は1、4、7と表示されます。
このSortというメソドはArrayクラスに格納されているデータを有る規則に従って並べ替えます。
例えばArrayクラスに文字列が格納されている場合はSortメソドを実行すると文字は大文字小文字を
無視して、Asciiコード順にソートされます。
Arrayクラスに数値が格納されている場合は、数値の小さい順にソートされます。
では文字列を大文字小文字を区別してソートするにはどの様にするのでしょうか?
又数値を降順にソートするには?
更に自分の好きな様にソートしたいと考えるかもしれません。

この様な色々なソートを実現する為にはソートの方法をその使用者に任せてしまえばいいのです。
ソートは本来2つの値を比較して小さい方を前に大きい方を後ろに設定します。
つまりソートとは2つの値の比較と再配置の繰り返しです。
そこでこの比較の方法をSortの使用者に開放してしまえば良いことになります。

インターフェースの定義
ではStringクラス又はIntegerクラスが持つSortメソドの2つの値の比較メソドを書き換えるには
どの様なことをすればよいのでしょうか?
この方法を提供するのがインターフェースで、インターフェースは次の様に書かれます。
(実際はこのコードはコモン・ランタイム・モジュール CLRの中に書かれており、この通りではないかも知れません。)
C# コード
interface IComparable
{
int CompareTo(object x);
}
これはIcomparableインターフェースはComparareToメソドを持ち、このCompareToメソドは1つのobjectの
引数を持ち、Integerの値を返すと言う意味です。
そしてこのメソドのCompareToが大小比較の為のメソドとなります。
しかしながらCompareToが一体何をするかは全く書かれていません(実装がなされていません)。
それは使用者が自由に書きなさい(実装しなさい)ということなのです。

インターフェースを持つクラスの記述
さてこのインターフェースを持つクラスはどの様に記述するのでしょうか?
C# コード
class intArray : IComparable
{
//.........
}
この様にクラス後ろに続けてコロン(:)とインターフェース名を書きます、インターフェースはピリオド(,)で区切って
幾つでも指定出来、そしてこのことをインターフェースを実装すると言います。
インターフェースの名前は自由ですが慣例として頭に大文字の「I」をつけることになっています。
ここで重要なルールが有ります、インターフェースを実装した場合は必ず其のインターフェースが規定するメソド
この場合はCompareToを実装する必要が有ります。

もし実装を忘れるとコンパイラーがエラーを報告します。

インターフェースのメソドの実装
実際にこのクラスにCompareToを実装してみましょう。
Sortメソドが呼び出すComareToは引数と自分を比較して自分が小さければ負の値を、同じならば0を
自分が大きければ正の値を返します。
SortはComareToを呼び出して負の値が返ったら自分を前に、同じなら何もせずに、正の値が返ったら、
自分を後ろにします、intArrayクラスに実装するCompareToは其のことを念頭に入れて実装します。
C# コード
//内部にIntegerの値を持つクラス
public class intArray : IComparable
{
//内部の変数
public int ivalue;

//CompareToの実装
public int CompareTo(object obj)
{
int inewvalue = ((intArray)obj).ivalue;
return (ivalue - inewvalue);
}

//コンストラクタで最初に値がセットされる
public intArray(int x)
{
ivalue = x;
}
}
実はこのコードの説明は面倒です、一応は説明しますが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)
{
intArray[] intArry = new intArray[3];
intArry[0] = new intArray(1);
intArry[1] = new intArray(7);
intArry[2] = new intArray(4);
Array.Sort(intArry);

for (int i = 0; i <intArry.Length; i++)
Console.WriteLine(intArry[i].ivalue .ToString());
Console.Read();
}
結果は一番上のコードと同じ1、4、7と表示されます。
では今度は、intArrayクラスの
return (ivalue - inewvalue);を
return ( inewvalue-value );
と書き換えて見ます、実行結果は7,4,1となります。
つまり引数と自分の大小比較を書き換えれば好きな様にソートが出来ると言うことです。
例えば4を必ず先頭に来るようにソートする場合は
C# コード
//CompareToの実装
public int CompareTo(object obj)
{
int inewvalue = ((intArray)obj).ivalue;
if (ivalue == 4)
return -1;
else if (inewvalue == 4)
return 1;
else
return (inewvalue-ivalue);
}
CompareToを上の様に書き換えれば良いことになり、実行結果は4、7、1となります。

IntegerクラスもStringクラスもIComparableクラスを実装している
さてここでもう一度一番最初のコードを見て戴きたい。
Array.Sort(intArry);
でソートを行なっています、IntegerクラスはもともとIComparableインターフェースを実装しており
当然CompareToメソドを実装していて、Sortメソドはそれを使ってソートを行なっているのです。

Arrayクラスの持つインターフェース
ArrayクラスのSortメソドには幾つかのオーバーライドが有り、様々な引数が設定できますが、ここではArrayクラス
を引数に持つものと、ArrayクラスとIComparerを引数に持つものを表示しています。
名前 説明
 1  Array.Sort (Array) Array の各要素によって実装された IComparable を使用して、
1 次元 Array 全体の要素を並べ替えます。
.NET Compact Framework によってサポートされています。
 2  Array.Sort (Array, IComparer) 1 次元 Array 内の要素を、指定した IComparer を使用して
並べ替えます。
.NET Compact Framework によってサポートされています。
1番目の方法は既に説明済みで、引数に自分と比べるobjectを渡したものです。
比較は IComparableインターフェースのcompareToメソドが使用されています。
この方法は比べる自分をクラスの中で保持する必要が有り、数値や文字列の比較には面倒です。

インターフェース IComparerの使用
2番目の方法は引数にソートするArrayとインターフェースのIComparerを指定する方法です。
IComparerインターフェースのCompareメソドは、2つのObjectの引数を取り、Integerの値を返します。
下のコードはmyCompareと言うクラスを宣言し、CLRが持つIComparerインターフェスを実装させています。
メソドCompareは比べる対象をIntger型の引数に限定して、始めの引数が小さければ負の値を
大きければ正の値を、同じなら0を返します。
C# コード
//IComparer クラスのComparメソドの実行
class myCompare :IComparer
{
public int Compare(object x, object y)
{
return ((int)x-(int)y);
}
}
呼び出す方のコードは以下の様になります。
C# コード
class Program
{
static void Main(string[] args)
{
int[] intArry = { 1, 7, 4 };
Array.Sort(intArry,new myCompare());
for (int i = 0; i < intArry.Length; i++)
Console.WriteLine(intArry[i].ToString());
Console.Read();
}
}
ソートの方法は
return ((int)x-(int)y);
の部分を書き換えることにより自由に決めることが出来ます。
return ((int)y-(int)x);
とすることで、ソートが降順になることを確かめて下さい。
この方法の方がIComparableインターフェースのCompareToメソドを使用するよりコードが直感的で
簡単になります。

以上この章ではインターフェースを.NET Frameworkが持つIComparableインターフェースと
IComparerインターフェースを使って説明しましたが、インターフェースは自由に設定出来ます。
又インターフェースはメソドだけではなく、プロパティやインデクサを設定することも可能です。
画像ファイル