2016-08-23 15 views
1

具体的なクラスからインタフェースを抽象化する場合、インタフェースに拡張メソッドが含まれている必要がありますか?コンテキストは、特にユニットテスト容易性のためのものです。インタフェース内の拡張メソッドを含む

+3

いいえ、それは動作しません。インタフェースがメソッドを宣言した場合、クラスはメソッドを実装する必要があります。拡張メソッドを特定のテストケースでユニットテストすることができます。これは単に_another_クラスの静的メソッドであるためです。 –

+0

インターフェイスには拡張メソッドを定義するために必要なクラスが含まれていない可能性があるので、あなたの質問は混乱します。あなたは、拡張メソッドを持つクラスがインタフェースと同じファイル内に含まれるべきかどうか尋ねようとしていますか? – User

答えて

1

あなたがこのケースを説明しているので、私はいいえと言っています。あなたの拡張メソッドが単体テストのコンテキストでのみ有用である場合は、テストプロジェクトの拡張メソッドとしてそれらを保持してください。

代わりに、拡張メソッドをクラスに移動して(通常のパブリックメソッドに変更する)、それらをインターフェイスに含めることができます。これにより、あなたのクラスを消費するすべてのものが利用できるようになります。これはunittestコードにとって望ましくありません。

エクステンションメソッドは、責任範囲を制御したり除外したりしないクラスに機能を追加するのに最適です。これは後者の古典的な例です。

0

クラスはSomeOtherClassに依存し、それはその後、両方のインスタンスメンバーSomeOtherClass静的メンバに依存する場合、あなた可能性のいずれかの一部にすることができ

  • 変更インスタンスメンバーへの静的メンバインターフェイス
  • SomeOtherClassをインターフェイスで置き換えることができるように、静的メンバーを別の拡張クラス(またはその他の依存関係)に配置します。

依存関係のインスタンスメンバーと静的メンバーの両方を使用することで、効果的に依存関係が2つになります。

メソッドは、クラス自体が機能するために必要な場合は、おそらくそのクラスのメンバーである必要があります。これは、オブジェクト(インスタンスメンバー)とオブジェクトのタイプ(静的メンバー)によって異なります。他のクラスがそのクラスの責任外の方法でそのクラスを使用するために必要な場合(クラスを他のクラスにマップするメソッドのように)、それを分離します。

メソッドがクラスによって必要であり、他のクラスで必要なメソッドの場合、元のクラスと他のクラスの両方が依存できる別のクラスにメソッドを分けることができます。

0

いいえこれにはいくつか問題があります。まず、インターフェイスの公開インスタンスのメソッドのみが記述されています(つまり、実装されていない可能性があり、インターフェイスに静的メソッドを指定することはできません)。拡張メソッドはコンパイル時に実装する必要があり、インスタンスメソッドではなく静的メソッドです。あなたは、インスタンスメソッド 構文で拡張メソッドを呼び出すあなたのコードではdocumentation

によると、この時点で注意してください。ただし、コンパイラ によって生成された中間言語(IL)は、コードを静的メソッドの呼び出しに変換します。言い換えれば

、それは(あなたがいずれかのように扱うことができたとしても)本当にインスタンスメソッドではありません。 "ボンネットの下に"それはまだ静的な方法です。

また、拡張メソッドは静的クラスで定義する必要があります(拡張メソッドの実装方法については、Microsoftのinstructionsを参照)。

にはインターフェイスの拡張メソッドがあります。拡張するタイプが具体的である必要はありません。例えば:私はITestInterfaceインタフェースを実装する具象クラスをインスタンス化するとき

public static class Class2 
{ 
    public static void Extension(this ITestInterface test) 
    { 
     Console.Out.WriteLine("This is allowed"); 
    } 
} 

は今、私はそれに拡張メソッドを呼び出すことができます。

// "Test" is some class that implements the ITestInterface interface 
ITestInterface useExtensionMethod = new Test(); 
useExtensionMethod.Extension(); 

これは、あなたがやりたいことができます。以下の二つのクラスの例として

0

、:

は、他の人が言ったようにインターフェイスを作成するとき、あなたは SomeClassの公共、非静的メンバに制限されている
class SomeClass 
{ 
    public Prop1 { get; } 
    public void Method1() { .... } 
} 

static class SomeExtensions 
{ 
    public static ExtensionMethod(SomeClass this sc) { ... } 
} 

、しかし、それはまたです

static class SomeExtensions 
{ 
    public static ExtensionMethod(ISomeClass this sc) { ... } 
} 
+0

はい、いい点ですが、私は拡張メソッドがインタフェースをパラメータ型として取るかもしれないという事実を反映するために私の答えを編集しました - 私はこれが彼が探していることを行うことができると思います(たとえインタフェース自体が*拡張メソッドを含む)。 IMHO具体的なクラスではなくインタフェースに対してプログラミングを一貫しているように、具体的なクラスで拡張メソッドを行うよりも、これはおそらく良い方法です。 – EJoshuaS

関連する問題