4

私は以下のようなインターフェースを持っています:

public interface IInterface
{
    void Open();
    void Open(bool flag);
    void Open(bool flag, bool otherFlag);
}

インターフェイスを実装すると、次のようになります。

public class IClass : IInterface
{
    void IInterface.Open()
    {
        Open(false, false);
    }

    void IInterface.Open(bool flag)
    {
        Open(flag, false);
    }

    void IInterface.Open(bool flag, bool otherFlag)
    {
         //Do some stuff
    }
}

今、私が直面している問題は、IClass の最初の 2 つの関数本体内で、3 番目の関数を呼び出せないことです。エラーが発生します:

名前 'Open' は現在のコンテキストに存在しません

さて、(組織内の別のチームからの要件により) インターフェイスを明示的に実装すると、「オープン」コンテキストの問題が発生します。3 つのオープン メソッドから明示的な IInterface を削除すると、明示的に実装された他のメソッド (ここには記載されていません) を使用しても正常にコンパイルできますが、これが何を意味するのかはわかりません。

インターフェイスメソッドを明示的に実装しながら、3 番目のメソッドを呼び出す方法はありますか?

ありがとう!

4

4 に答える 4

7

明示的な実装では、実装クラス内であっても、インターフェース型の参照を直接使用する必要があります。

    void IInterface.Open()
    {
        (this as IInterface).Open(false, false);
    }

    void IInterface.Open(bool flag)
    {
        (this as IInterface).Open(flag, false);
    }

明示的な実装を保持する別の方法は、呼び出しをプライベート メソッドに委任することです。

    private void Open(bool flag, bool otherFlag)
    {
        // Do some stuff.
    }

呼び出しは次のメソッドにマップされます。

    void IInterface.Open()
    {
        Open(false, false);
    }
    void IInterface.Open(bool flag)
    {
        Open(flag, false);
    }
    void IInterface.Open(bool flag, bool otherFlag)
    {
        Open(true, true);
    }

また、クラス名は慣習に反することに注意してくださいI。接頭辞を削除してください。

于 2013-06-20T08:14:50.330 に答える
3

できるよ:

((IInterface)this).Open(false, false);

考慮すべきことの 1 つは、IInterface毎回再実装するのではなく、他のオーバーロード拡張メソッドをオンにすることです。

public static void Open(this IInterface iface, bool flag)
{
    iface.Open(flag, false);
}
于 2013-06-20T08:14:14.037 に答える
1

this最初にキャストして、オブジェクトをインターフェイスとして明示的に扱うようにしてください。

void IInterface.Open(bool flag)
{
   ((IInterface)this).Open(flag, false);
}
于 2013-06-20T08:14:58.117 に答える
1
void IInterface.Open()   
{      
    (this as IInterface).Open(false, false);
}
于 2013-06-20T08:15:03.237 に答える