1

以下で説明するコンテキスト/シナリオに基づいて、Implement Interface Explicitlyが C# で何を伴うのかを理解したいと思います。次のインターフェースがあるとしましょう:

public interface ITestService
{
    void Operation1();
    void Operation2();
}

以下に示すようにインターフェイスを明示的に実装するとしましょう。何らかの手段を使用して Operation1() から Operation2() を呼び出すことは可能ですか?

public sealed class TestService : ITestService
{
    public TestService(){}

    void ITestService.Operation1()
    {
        // HOW WOULD ONE SUCCESSFULLY INVOKE Operation2() FROM HERE. Like:
        Operation2();
    }

    void ITestService.Operation2()
    {

    }
}

以下で異なるように宣言された testService1 と testService2 が異なる動作をするようにするために、(ラップの下で) 何が異なるのでしょうか?

static class Program
{
    static void Main(string[] args)
    {
        ITestService testService1 = new TestService();      
        testService1.Operation1(); // => Works: WHY IS THIS POSSIBLE, ESPECIALLY SINCE Operation1() AND Operation2() WOULD BE *DEEMED* private?
        // *DEEMED* since access modifiers on functions are not permitted in an interface

        // while ...
        TestService testService2 = new TestService();
        testService2.Operation1(); //! Fails: As expected
    }
}
4

2 に答える 2

1
void ITestService.Operation1()
{
    ((ITestService)this).Operation2();
}

2番目の質問について:

インターフェイスのすべてのメンバーはパブリックです。したがって、実装も公開されます。

于 2012-07-05T10:57:51.823 に答える
1

2番目の質問について

testService1.Operation1(); // => 動作: 特に Operation1() と Operation2()が非公開と見なされるため、なぜこれが可能 なのでしょうか?

インターフェイスの関数はパブリックであるため、それらを呼び出すことができます。また、インターフェイス メソッドを明示的に実装しているため、クラス オブジェクトに対して呼び出すことはできません。例えば

TestService ts = new TestService();
ts.Operation1();// this would cause an error

明示的なインターフェイスの実装 (C# プログラミング ガイド)

于 2012-07-05T11:01:30.713 に答える