Freakishlyか面の多型インタフェースで構成
-
23-08-2019 - |
質問
その結、次のようなコードプロジェクト仕事をしています。と思ったんさせていただきましたいのですが、今思うであろうと考える建築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
具二つの界面でお客様でご使用のいずれかです。
.純できるインタフェースを実施すること--として知られ 明示的なインタフェース実装.
明示的なインタフェース実装に役立つ場合:
- 二つのインタフェースの定義
- を導入するために必要なインターフェースがない私はコンテンツの範囲と質に違いは、特定の会員がクライアントコードが宣言されていませんの参照用のインタフェースの種類
例の場合は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
{
// ...
}
他のヒント
各タイプは インタフェースマッピング有していますem>のタイプで取得することができの(。 GetInterfaceMap のあなたが反射でそれを見たい場合)。これは、基本的には、「インターフェイスYのメソッドXが呼び出されると、このメソッドはZがコールするものです。」と言いますマッピング対象方法は、インターフェースのメソッド名とは異なる名前を持つことは、C#でサポートされていないにもかかわらず、それが可能だと注意してください! (VBは、明示的にこれをサポートして、私は信じています。)
あなたのケースでは、あなたは3つのメソッドを持っており、3つの方法のそれぞれが関与インタフェースのいずれかのメソッドに対応します。
コンパイラは、インターフェースを介して仮想メソッドの呼び出しを発行すると、ILが発生したようなもの「とは、このオブジェクトにIFoo.Barを呼ぶ」と言う - とIFoo.Barは、インターフェース・マップを使用して解決される。
。あなたは時々どちらかあなたは同じメソッド名を持って起こるが、別のことを行う必要がある2つの異質のインターフェイスを実装している場合、戻り値の型のみが異なる、または署名を持っている場合は、それを使用する必要があるかもしれません。あなたはをどこの、しかしそれを避ける行うことができます!それは非常に混乱したコードになります。