質問

その結、次のようなコードプロジェクト仕事をしています。と思ったんさせていただきましたいのですが、今思うであろうと考える建築gaffは自分につながっています。

私の質問をす:

  • んでいること。
  • この現実世界での利用。
  • しているのは、同じるのか?

ここで私のインターフェイス:

namespace ThisAndThat
{
    public interface ICanDoThis
    {
        string Do();
    }

    public interface ICanDoThat
    {
        string Do();
    }

    public interface ICanDoThisAndThat : ICanDoThis, ICanDoThat
    {
        new string Do();
    }
}

ここでの私のコンクリートのクラス:

namespace ThisAndThat
{
    public class CanDoThisAndThat : ICanDoThisAndThat
    {
        public string Do()
        {
            return "I Can Do This And That!";
        }

        string ICanDoThis.Do()
        {
            return "I Can Do This!";
        }

        string ICanDoThat.Do()
        {
            return "I Can Do That!";
        }
    }
}

私の通試験:

using Xunit;

namespace ThisAndThat.Tests
{
    public class ThisAndThatTests
    {
        [Fact]
        public void I_Can_Do_This_And_That()
        {
            ICanDoThisAndThat sut = new CanDoThisAndThat();

            Assert.Equal("I Can Do This And That!", sut.Do());
        }

        [Fact]
        public void I_Can_Do_This()
        {
            ICanDoThis sut = new CanDoThisAndThat();

            Assert.Equal("I Can Do This!", sut.Do());
        }

        [Fact]
        public void I_Can_Do_That()
        {
            ICanDoThat sut = new CanDoThisAndThat();

            Assert.Equal("I Can Do That!", sut.Do());
        }

    }
}
役に立ちましたか?

解決

あり、そのようにこのコードではなくユーザーでなパターンを任意の名前を私がよく知っています。 CanDoThisAndThat 具二つの界面でお客様でご使用のいずれかです。

.純できるインタフェースを実施すること--として知られ 明示的なインタフェース実装.

明示的なインタフェース実装に役立つ場合:

  1. 二つのインタフェースの定義
  2. を導入するために必要なインターフェースがない私はコンテンツの範囲と質に違いは、特定の会員がクライアントコードが宣言されていませんの参照用のインタフェースの種類

例の場合は2にするために設計されています。NETフレームワークが ICollection.SyncLock. List<T>ICollection しかし、以下のコードはコンパイルが会員の故意にして隠れた'としてのデザイナーのBCLな提唱者でロックコレクションこの方法:

List<object> list = new List<object>();

lock (list.SyncRoot) // compiler fails here
{
    // ...
}

他のレガシーコードのこのフォーマットも作品では、参照の型 ICollection 明示的に:

ICollection list = new List<object>();

lock (list.SyncRoot) // no problem
{
    // ...
}

他のヒント

各タイプは インタフェースマッピングタイプで取得することができの(。 GetInterfaceMap のあなたが反射でそれを見たい場合)。これは、基本的には、「インターフェイスYのメソッドXが呼び出されると、このメソッドはZがコールするものです。」と言いますマッピング対象方法は、インターフェースのメソッド名とは異なる名前を持つことは、C#でサポートされていないにもかかわらず、それが可能だと注意してください! (VBは、明示的にこれをサポートして、私は信じています。)

あなたのケースでは、あなたは3つのメソッドを持っており、3つの方法のそれぞれが関与インタフェースのいずれかのメソッドに対応します。

コンパイラは、インターフェースを介して仮想メソッドの呼び出しを発行すると、ILが発生したようなもの「とは、このオブジェクトにIFoo.Barを呼ぶ」と言う - とIFoo.Barは、インターフェース・マップを使用して解決される。

あなたは時々どちらかあなたは同じメソッド名を持って起こるが、別のことを行う必要がある2つの異質のインターフェイスを実装している場合、戻り値の型のみが異なる、または署名を持っている場合は、それを使用する必要があるかもしれません。あなたはをどこの、しかしそれを避ける行うことができます!それは非常に混乱したコードになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top