2

抽象クラスを使用してネストされたインターフェイスを実装しようとしたときに、C#4.0で誤ってこれに遭遇しました。

public class A
{
    public interface InnerInterface
    {
        void Method();
    }
}

public abstract class B : A.InnerInterface
{
    public abstract void A.InnerInterface.Method();
}

public class C : B
{
    public override void A.InnerInterface.Method()
    {
        System.Console.WriteLine("C::A.InnerInterface.Method()");
    }
}

残念ながら、上記のコードはコンパイルに失敗し、次のエラーが発生します。

エラーCS0106:修飾子'abstract'はこのアイテムには無効です

エラーCS0106:修飾子'public'はこのアイテムには無効です

エラーCS0106:修飾子'override'はこのアイテムには無効です

エラーCS0106:修飾子'public'はこのアイテムには無効です

ただし、インターフェイスがネストされていないインターフェイスである場合は、次のようになります。

public interface SomeInterface
{
    void Method();
}


public abstract class B : SomeInterface
{
    public abstract void Method();
}

public class C : B
{
    public override void Method()
    {
        System.Console.WriteLine("C::Method()");
    }
}

コンパイルはOKです。

最初のケースでコンパイラエラーが発生するのはなぜですか?ここで何かが足りませんか?または、抽象クラスを使用してネストされたインターフェイスを実装することは許可されていませんか?

4

1 に答える 1

2

問題はネストではなく、明示的なインターフェースの実装にあります。「実用的な」例を使用するように変更した場合:

public abstract void SomeInterface.Method()

同じ問題が発生します。ネストされたインターフェースで暗黙のインターフェース実装を簡単に使用できるはずです。

public abstract class B : A.InnerInterface
{
    public abstract void Method();
}

public class C : B
{
    public override void Method()
    {
        System.Console.WriteLine("C::A.InnerInterface.Method()");
    }
}

...明示的なインターフェイスの実装を使用する場合は、ネストされたインターフェイスに対して、ネストされていないインターフェイスと同じように機能する必要がありますただしpublic、明示的なインターフェイス実装については記述せず、抽象化することもできません(IIRC)。

于 2012-09-10T04:02:19.200 に答える