2017-03-08 6 views
1

前にクラスメンバーとして実装されたインターフェイスは見ていませんでした。誰かが何が起こっているのか説明できますか?インターフェイスをインスタンス化することは許可されていますか?これらのインタフェースで必要とされるメソッドの実装はどこですか?このインターフェイスがこのようにクラス内で実装されているのはなぜですか?

public class MyClass 
{ 
    private readonly ITest1 interface1; 
    private readonly ITest2 interface2; 
    private readonly ITest3 interface3; 

    public MyClass(ITest1 interface1, ITest2 interface2, ITest3 interface3) 
    { 
     this.interface1 = interface1; 
     this.interface2 = interface2; 
     this.interface3 = interface3; 
    } 

    public void TestMethod() 
    { 
     var lines = interface1.GetData(); 
     var file = interface2.Parse(lines); 
     interface3.Copy(file); 
    } 
} 

私は通常のインターフェイス使用してきた方法に比べて違いは何です:

public class Person : IEquatable<Dog> 
{ 
    public int Age { get; set; } 

    public bool Equals(Dog d) 
    { 
     if (d.Age == this.Age) 
      return true; 
     else 
      return false; 
    } 
} 

public class Dog 
{ 
    public int Age { get; set; } 
} 
+5

悪気が、私はあなたが本当に特別インターフェースがどのように動作するか、C#の上のいくつかのチュートリアルを通過し、実行する必要があると思います。 – DavidG

+0

最初の例を説明するものは何も見つかりませんでした。私が見つけたのは、2番目の例と同様のものです。 – eek142

+0

インタフェースをインスタンス化しておらず、インスタンスを使用しています(通常どおり)が、指定されたインタフェースに応答します。つまり、定義されたメソッドを実装していますが、実装はインタフェースにありません –

答えて

3

違いがある:あなたがあなたのPersonクラスでやっていること

インタフェースの実装です。

MyClassはインターフェイスを実装していませんが、インターフェイスをコンストラクタパラメータとして受け入れています。誰でもコンストラクターを呼び出すと、そのインターフェースを実装するインスタンスが提供されます。以下に続きます。

インターフェイスをインスタンス化することはできますか?

なし。インタフェースを実装するクラスがインスタンス化されます。

これらのインターフェイスで必要なメソッドの実装はどこですか?

人がクラスのインスタンスを作成すると、その人はそのインターフェイスを実装するクラスのインスタンスを渡します。このように:

public interface ITest1 
{ 
    string GetData(); 
} 
public class Test1 : ITest1 
{ 
    public string GetData() 
    { 
     return "Data"; 
    } 
} 

彼らは、このようなあなたのクラスを呼び出します:私は前にクラスのメンバとして実装されたインタフェースを見ていない

var test1 = new Test11(); 

// instead of nulls it will be other instances like test1 
var myClass = new MyClass(test1, null, null); 

を。誰かが何が起こっているのか説明できますか?

私は上の例で説明したことが起こっています。

これは実際には非常に一般的な方法ですが、他にも方法がありますが、これは方法の1つです。

利点

  1. この方法は、あなたのMyClassは、具体的なタイプが渡されます何わかりませんが、それは具体的なタイプにかかわらず知っている、それはインターフェイスをサポートします。

  2. MyClassの中には、インターフェイスに依存するコードしかないため、クラスが疎結合していることになります。

  3. 依存性注入は、MyClassのコンストラクタに依存性を注入するために使用できます。それはコンストラクタインジェクションと呼ばれます。

    は違いはありません:私は、通常のインターフェイスを使用していた方法に比べて違いは何

。しかし、どのように人々がクラスを使用するかについて考える必要があります。

public class Test1 : ITest1 
{ 
    public string GetData() 
    { 
     return "Data"; 
    } 
} 

は、さらに明確にMyClassを想像するには、このような別のコンストラクタとフィールド持っていた:

private readonly IEquatable<Dog> iEq; 
public MyClass(IEquatable<Dog> iEq) { this.iEq = iEq; } 
をお MyClassを使用したい場合たとえば、あなたがするために使用されているまさにであるこれを行います

次に、Personクラスのインスタンスで呼び出すことになります。だから違うわけではありません。

:何人も犬と同一視されて幸せになりません。)

+0

これは意味があります。基本的に、インタフェースはその契約を実装するクラスを表しています。それは私が混乱していたものです。あなたが言ったように、インターフェイスを実装している限り、どのような具体的な型を渡すかは問題ではありません。ありがとう! – eek142

+0

あなたはそれを持っています。混乱を助けて喜んでください。 – CodingYoshi

1

インターフェイスをインスタンス化することはできませんが。派生クラスはコンストラクターに渡されるものになります。

​​

をし、彼らにこのようなものを使用します:

はそうあなたには、いくつかのクラスを持つことになりますが、インターフェイスをインスタンス化することはできません

var a = new A(); 
var b = new B(); 
var c = new C(); 
var mc = new MyClass(a, b, c); 
mc.TestMethod(); 
1

を、あなたは彼の継承されたタイプのインタフェースを置き換えることができます!インターフェース1、インターフェイス2およびインターフェース3:あなたは、クラスMyClassにおける三つのフィールドを作成している

public class MyClass 
{ 
    public MyClass(ITest1 interface1, ITest2 interface2, ITest3 interface3) 
    { 
     this.interface1 = interface1; 
     this.interface2 = interface2; 
     this.interface3 = interface3; 
    } 

    public void TestMethod() 
    { 
     var lines = interface1.GetData(); 
     var file = interface2.Parse(lines); 
     interface3.Copy(file); 
    } 

    private readonly ITest1 interface1; 
    private readonly ITest2 interface2; 
    private readonly ITest3 interface3; 
} 

これはインターフェースの通常の使用(あなたの例)があります。

クラスコンストラクタでは、ITest1,ITest2およびITest3の実インスタンスを挿入できます。これらのインスタンスは、適切なインタフェースを実装したいくつかのクラスの型でなければなりません。

例:

あなたがインターフェイスを実装し、次の例のようなオブジェクトを提供することができる:MyClassを作成する

public class Test1 : ITest1 
{ 
    public string GetData() 
    { 
     // code 
    } 
} 

public class Test2 : ITest2 
{ 
    public string GetData() 
    { 
     // code 
    } 
} 

public class Test3 : ITest3 
{ 
    public string GetData() 
    { 
     // code 
    } 
} 

例は次のようになります

var test1 = new Test1(); 
var test2 = new Test2(); 
var test3 = new Test3(); 
var myClass = new MyClass(test1, test2, test2); 

オブジェクトtest1test2及びtest3はインターフェイスを実装しています,ITest2およびITest3

結論

魔法はありません。 インタフェースは継承された型の型に置き換えられます!基本的には、コード内の抽象化の実装を提供しています。

関連する問題