無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

C#をつつく27ーインターフェイス。約束は守ろう。

今回はインターフェイスをつつくピヨ。インターフェイスとは、オブジェクトが持つべき要素を定義したものなんだ。一説によるとこの概念はCOM(Componet Object Model)から受け継いだものらしい。でも、Javaとか既存言語からある概念だから、.NETのインターフェイスはCOMと既存のインターフェイスの融合だと思うピヨ。
じゃあ、早速インターフェイスの定義方をつつくピヨッ!


//実用的でない例
public interface IFoo
{
    //実装するべきプロパティ
    object FooProperty { set;get; }

    //実装するべきメソッド
    void FooMethod( object obj );
    void FooMethod1( object obj );
    object FooFunction( );

    //実装するべきイベント
    event EventHandler FooEvent;
}


どう?難しくないよね♪インターフェイスの定義はinterfaceキーワードを使用するところと、Publicとかのアクセス修飾子を指定しない点と、実装を書かない点がが特徴ピヨ。何故アクセス修飾子を指定しないのかというと、.NETではインターフェイスは基本的に外部に対する約束事だからなんだよ。
この定義したインターフェイスを実装するクラスは次のようにするピヨ。


//開発ソフトに任せた実装
public class FooClass : IFoo //つんつん
{
    #region IFoo メンバ

    public object FooProperty {
        get {
            throw new Exception( "
                The method or operation is not implemented." );
        }
        set {
            throw new Exception( 
                "The method or operation is not implemented." );
        }
    }

    public void FooMethod( object obj ) {
        throw new Exception( 
            "The method or operation is not implemented." );
    }

    public void FooMethod1( object obj ) {
        throw new Exception( 
            "The method or operation is not implemented." );
    }

    public object FooFunction( ) {
        throw new Exception( "The method or operation is not implemented." );
    }

    public event EventHandler FooEvent;

    #endregion
}


C#ではクラス名 : インタフェース名で指定して実装するんだ。VB.NETみたいに、一々各要素でどのインタフェース要素を実装するのかを宣言しなくてもいいピヨ。その代り、VB.NETとは違って、複数に対応する事は不可能なんだ。仕方がないよね。 あと、C#は基本的にインタフェースを明示しないけども明示的実装は可能ピヨ。こんな風にね。


//アクセス修飾子は書いたら駄目!
void IFoo.FooMethod( object obj ) {
    throw new Exception( 
        "The method or operation is not implemented." );
}


説明するね。インタフェースの明示的実装はインタフェース名.要素名で宣言するピヨ。ここで注意しなくてならないのはアクセス修飾子は指定できないということピヨ。何故かというと、C#コンパイラがprivateに設定するからなんだ。勝手につけられたら困るわけだね。アッ忘れるところだった。それと、明示的実装をする際にはvirtualキーワードはつけられないピヨ。この理由は、インターフェイスを実装する型に属せず、インターフェイスに属すると看做されるからピヨ。これについては、わかりにくいと思うけど、説明しだすと長いから違う機会にするよ。 それで、何故こんな機能が必要なのかというと、複数のインターフェイスを実装する際に名前が同じ場合があるからなんだ。こんな風にね。

public interface IBar
{
    void FooMethod( object obj );
}

//FooMethodどうしよう・・・
public class FooClass : IFoo, IBar
{


こんな場合IFoo.FooMethodとIBar.FooMethodと明示的に実装すればOKなんだよ。その代り使用する際にはこんな風にキャストが必要になるけどね。

FooClass obj = new FooClass( );
( ( IBar ) obj ).FooMethod( );


ちょっと面倒くさいけど、どれを実行していいのかわからないから仕方がないよね。

最後に、インターフェイスとクラスの使い分けについて囀るピヨ。クラスは縦に継承されていくけど、インターフェースは横に継承される点が違うピヨ。 クラスの場合、親から子へと意味ある継承をするけど、全ての状況に対応できるわけじゃないんだ。 何故かというと、直接的には関係ないけど同じ要素を持つことがあるからなんだ。 クラスの継承は親子の遺伝。 インターフェイスの継承は師弟関係と覚えたらいいよ。
今回はこれで終わり。
別窓 | C# | コメント:0 | トラックバック:0 | ∧top | under∨
<<C++/CLIをつつく27−インターフェイス。約束は守ろう。 | 無差別に技術をついばむ鳥 | VB.NETをつつく27ーインターフェイス。約束は守ろう。>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |