40

これが話です。インターフェースを作成しましたIVehicle。私は自分のクラスにインターフェイスを明示的に実装しましたVehicle.cs

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

Interface IVehicle
{
        int getWheel();
}

ここに私のクラスがあります:

class Vehicle: IVehicle
{

     public int IVehicle.getWheel()
     {
         return wheel;
     }

     public void printWheel()
     {
         Console.WriteLine(getWheel());
     }
}

getWheel()が明示的に実装されていることに注意してください。ここで、Vehicle クラス内でそのメソッドを呼び出そうとするgetWheel()と、現在のコンテキストに存在しないことを示すエラーが表示されます。誰かが私が間違っていることを理解するのを手伝ってくれますか?

4

3 に答える 3

50

インターフェイスを明示的に実装する場合は、まずオブジェクトをインターフェイスにキャストする必要があります。その後、メソッドを呼び出すことができます。つまり、メソッドは、具体的な型としてではなく、インターフェイスの型としてオブジェクトで呼び出された場合にのみ使用できます。

class Vehicle: IVehicle {

     public int IVehicle.getWheel()
     {
         return wheel;
     }

     public void printWheel()
     {
         Console.WriteLine( ((IVehicle)this).getWheel() );
     }
}

詳細については、MSDN のこのリファレンスを参照してください。関連するスニペットは次のとおりです。

メソッド呼び出し、プロパティ アクセス、またはインデクサー アクセスで、完全修飾名を使用して明示的なインターフェイス メンバーの実装にアクセスすることはできません。明示的なインターフェイス メンバーの実装は、インターフェイス インスタンスを介してのみアクセスでき、その場合は単にそのメンバー名によって参照されます。

それだけの価値があります-これはおそらく、明示的なインターフェース実装の特に良い使い方ではありません。通常、典型的な操作用の完全なインターフェイスを持ち、それらの操作の一部を置き換える可能性のあるインターフェイスも実装するクラスがある場合は、明示的な実装を使用します。標準的な例は、Fileを実装するクラスですIDisposable。メソッドはありClose()ますが、実装する必要がありますDispose()。として扱う場合Fileは、 を使用しますOpen/Close。ただし、using ステートメントで開くと、IDisposableand 呼び出しとして扱われますDispose。この場合Dispose、単に を呼び出しますClose。から同じ動作を利用できるため、必ずしも実装Disposeの一部として公開する必要はありません。FileClose.

于 2010-03-26T01:57:55.450 に答える
13

MSDNによると:

インターフェイス メンバーを明示的に実装することは可能 です。つまり、インターフェイスを介してのみ呼び出され、そのインターフェイスに固有のクラス メンバーを作成します。

そして、C# 言語仕様では:

メソッド呼び出し、プロパティ アクセス、またはインデクサー アクセスで、完全修飾名を使用して明示的なインターフェイス メンバーの実装にアクセスすることはできません。明示的なインターフェイス メンバーの実装は、インターフェイス インスタンスを介してのみアクセスでき、その場合は単にそのメンバー名によって参照されます。

このメンバーにアクセスするには、まずクラスをインターフェイスにキャストしてからアクセスします。

于 2010-03-26T01:59:06.407 に答える
4

クラスで多くの退屈なキャストを避けるために、インターフェイス型としてポインターを作成できます

public class Foo : IBar
{
    readonly IBar bar;
    public Foo()
    {
       bar = this;
    }
}

そして、次を使用してメンバーを呼び出しますbar.

于 2015-04-24T05:19:16.413 に答える