c#インタフェースプログラミングの定義インタフェースを全面的に分析する
2933 ワード
インタフェースメンバーの定義
インタフェースには、メソッド、プロパティ、インデックス・インジケータ、イベントなどの1つ以上のメンバーが含まれますが、定数、ドメイン、オペレータ、コンストラクション関数、またはコンストラクション関数ではなく、静的メンバーは含まれません.インタフェース定義は、新しい定義空間を作成し、インタフェース定義に直接含まれるインタフェースメンバー定義は、新しいメンバーを定義空間に導入します.
説明:
・インタフェースのメンバーは、ベースインタフェースから継承されたメンバーと、インタフェース自体によって定義されたメンバーである.
・インタフェース定義は、0個以上のメンバーを定義することができる.インタフェースのメンバーは、メソッド、プロパティ、イベント、またはインデックスでなければなりません.インタフェースには、定数、フィールド、演算子、インスタンス構造関数、構造関数、またはタイプを含めることはできません.また、静的メンバーの種類も含めることはできません.
・メソッド、属性、イベント、およびインデックスを含む各可能な種類のメンバーに対するインタフェースを定義する.
・インタフェースメンバーのデフォルトアクセス方法はpublicです.インタフェースメンバー定義には、メンバー定義の前にabstract、public、protected、internal、private、virtual、override、static修飾子を追加することはできません.
・インタフェースのメンバー間で互いに同名にすることはできない.継承されたメンバーは定義する必要はありませんが、インタフェースは継承されたメンバーと同じ名前のメンバーを定義できます.この場合、インタフェースメンバーは継承されたメンバーを上書きしていると言いますが、エラーは発生しませんが、コンパイラは警告します.警告プロンプトを閉じるには、メンバー定義の前にnewキーを追加します.ただし、親インタフェースのメンバーが上書きされていない場合は、newキーを使用するとコンパイラに警告が表示されます.
・メソッドの名前は、同じインタフェースで定義されたすべての属性およびイベントの名前とは異なる必要があります.さらに、メソッドの署名は、同じインタフェースで定義された他のすべてのメソッドの署名とは異なる必要があります.
・属性またはイベントの名前は、同じインタフェースで定義されている他のすべてのメンバーの名前とは異なる必要があります.
・1つのインデックスの署名は、同じインタフェースで定義された他のすべてのインデックスの署名と区別されなければならない.
・インタフェースメソッド宣言の属性(attributes)、戻りタイプ(return-type)、識別子(identifier)、および形式パラメータリスト(formal-parameter-lis)は、クラスのメソッド宣言のそれらと同じ意味を持つ.インタフェースメソッド宣言では、メソッドボディの指定は許可されません.宣言は通常、セミコロンで終了します.
・インタフェース属性宣言のアクセス子は、クラス属性宣言のアクセス子に対応しており、アクセス子本体が通常セミコロンを使用する必要がある以外は.したがって、アトリビュートが読み書き、読み取り専用、または書き込み専用であっても、アクセス記号は完全に決定されます.
・インタフェースインデックス宣言の属性(attributes)、タイプ(type)、および形式パラメータリスト(formal-parameter-list)は、クラスのインデックス宣言のものと同じ意味を持つ.
次の例では、インタフェースIMyTestは、インデックスインジケータ、イベントE、メソッドF、属性Pのメンバーを含む.
interface IMyTest{
string this[int index] { get; set; }
event EventHandler E ;
void F(int value) ;
string P { get; set; }
}
public delegate void EventHandler(object sender, EventArgs e) ;
次の例では、インタフェースIStringListは、メソッド、プロパティ、イベント、インデックスの各可能なタイプのメンバーのインタフェースを含む.
public delegate void StringListEvent(IStringList sender);
public interface IStringList
{
void Add(string s);
int Count { get; }
event StringListEvent Changed;
string this[int index] { get; set; }
}
インタフェースメンバーの全権名
インタフェースメンバーを使用しても、全権名(fully qualified name)を使用できます.インタフェースの全権名はこのように構成されている.インタフェース名に小ドット"."次の2つのインタフェースについて、メンバー名を追加します.
interface IControl {
void Paint( ) ;
}
interface ITextBox: IControl {
void GetText(string text) ;
}
ここで、Paintの全権名はIControlである.Paint,GetTextの全権名はITextBoxである.GetText.もちろん、全権名のメンバー名は、ITextBoxなどのインタフェースで定義する必要がある.Paint.合理的ではない.
インタフェースが名前空間のメンバーである場合、全権名には名前空間の名前も含まなければなりません.
namespace System
{
public interface IDataTable {
object Clone( ) ;
}
}
では、Cloneメソッドの全権名はSystemです.IDataTable.Clone.