-2

今、私はインターフェースを勉強していますが、インターフェースの実現などのいくつかのことを理解できません。たとえば、私はいくつかのコードを持っています:

IModelDoc2 swModel; //IModelDoc2 is an interface. What are we doing here? 
boolstatus = swModel.Extension.SelectByID2(.....); //Some parameters

インターフェイスから呼び出してこのメ​​ソッドを実装する方法がわかりません。クラスはインターフェイスを実装でき、クラスからメソッドを呼び出すことができます。右?しかし、インターフェイスからメソッドを実装するにはどうすればよいでしょうか?

4

3 に答える 3

3

インターフェイス メンバーを実装するには、明示的と暗黙的の 2 つの方法があります。

明示的: http://msdn.microsoft.com/en-us/library/aa288461%28v=vs.71%29.aspx

暗黙: http://msdn.microsoft.com/en-us/library/aa664590%28v=vs.71%29.aspx

明示的な利点は次のとおりです。変数/メンバーのコンパイル時の型(宣言された型) がインターフェイスを実装するクラスである場合、明示的に実装されたメンバーを直接呼び出すことはできません。そのためにはインターフェイス参照が必要です。ただし、クラスまたは構造体変数をインターフェイス型にキャストしようとしてキャストしないでください。代わりに、インターフェイスの使用パターンを適切に使用する必要があります。インターフェイスは強力な抽象化ツールであり、実装を知ることから一部のコードを抽象化できます。つまり、コードのこの部分は実装に依存せず、インターフェイスを実装する構造体オブジェクトのクラス参照を受け取ることはなく、インターフェイス ポインターのみを受け取る必要があります。

interface MyInterface {
   void MyMethod(/*...*/);
   int MyOtherMethod(/*...*/);
   string MyProperty { get; set; }
}

class MyImplementation : MyInterface {
    // explicit implementations:
    void MyInterface.MyMethod (/*...*/) { /* ... */ }
    string MyInterface.MyProperty { get { return /*...*/; } set { something = value; /*...*/ } }
    // or even implicit:
    public int MyOtherMethod(/*...*/) { /* ... */ return /*...*/; }
    // Now, even you may have some public (better be internal) members,
    // they should not be used in implementation-agnostic code
    internal void SomeNonInterfaceMethod(/*...*/) { /*...*/ }
}

//...

MyInterface myImplementation = new MyImplementation(/*...*/);
// NOT MyInterface myImplementation = new MyImplementation(/*...*/);

//...

//some implementation-agnostic method:
void SomeUsingMethod(MyInterface implementation) { // NOT MyImplementation implementation
                                                   // it would kill the abstraction
    implementation.MyMethod(/*...*/);
    implementation.MyProperty = "some value";
    // but you cannot call
    // implementation.SomeNonInterfaceMethod(/*...*/); // won't work
    // if somewhere you need to do this
    MyImplementation violatedEncapsulationImplementation = (MyImplementation)implementation; // AVOID IT!
    violatedEncapsulationImplementation.SomeNonInterfaceMethod(/*...*/); // AVOID IT!
    // it would work, but it would be an indication of wrong code design
}

これで、基本的な考え方がわかりました。

于 2013-05-30T01:29:15.893 に答える
0

呼び出し元のコードで見られることと実際の実装で行われることの違いを理解するには、ポリモーフィズムを理解する必要があります。

実装には、そのインターフェイスを実装する実際のクラス (エッジ ケースを無視) が必要です。

呼び出しにはインターフェイスしか表示されない場合がありますが、その変数の実際の型は、そのインターフェイスを実装する何らかのクラスである必要があります。

あなたの例:

IModelDoc2 swModel; //IModelDoc2 is an interface. What are we doing here? 
boolstatus = swModel.Extension.SelectByID2(.....); //Some parameters

初期化されていないため、コンパイルさえしswModelません。

正しいコードは

IModelDoc2 swModel = new SomeClassImplementingIModelDoc2();
boolstatus = swModel.Extension.SelectByID2(.....); //Some parameters
于 2013-05-30T01:34:18.077 に答える