4

このトピックの目的は、同じメソッド名で2つのインターフェースを実装する方法を尋ねることではありません。なぜ抽象的または仮想的にメソッドの明示的な実装を作成できないのか、自問自答しています。ここで簡単です:

単純なクラス階層

AbstractClassは、以下を実装する抽象クラスです。

  • IFlexibility1Method()抽象として宣言することによって。
  • IFlexibility2Method2()仮想として宣言することによって。

ConcreteClassは-AbstractClassであり、Method()とを実装しMethod2()ます。大丈夫だよ !

ここで、IFlexibility1IFlexibilityインターフェイスが同じシグニチャvoidを持つメソッドを提供すると仮定しますMethod()。2つの異なる実装を作成する場合は、AbstractClassで明示的な実装ルールを使用する必要があります。

// Two explicit privates methods
void IFlexibility1.Method()
{

}

void IFlexibility2.Method()
{

}

ここに私の質問があります:最初の場合のようにサブクラスにこれらのメソッドを実装させることができないのはなぜですか。実際、仮想vo​​id IFlexibility1.Method()または抽象void IFlexibility2.Method()を宣言することはできません。これらのメソッドはプライベートであるため、ロジックです。しかし、次の構文は正しい保護された抽象void IFlexibility1.Method()である可能性があると思います。どう思いますか ?

これは21世紀の問題ではないので大丈夫です。さらに、この場合に一致する2つのインターフェースを実装することはあまりありません。また、Javaは、これらの理由から明示的な実装を提供していません。

4

1 に答える 1

2

明示的なインターフェイスの実装は、プライベートでもパブリックでもありません。それらは、定義されたインターフェースのインスタンスを介して単に公的にアクセス可能です。インターフェイス自体を実装するクラスから派生するクラスは、インターフェイスを実装しないため、インターフェイスのメンバーを明示的に実装できません。したがって、派生クラスはそのメンバーをオーバーライドできません(同じ理由で、明示的な実装を宣言できませんabstract)。

派生クラスはインターフェイスを実装することもできるため、そのインターフェイスのメンバーを明示的に実装することもできます。例えば:

    public class ConcreteClass : IFlexibility1, IFlexibility2
    {
        void IFlexibility1.Method()
        {
            Trace.WriteLine("CC");
        }

        void IFlexibility2.Method()
        {
        }
    }

    public class Impl2 : ConcreteClass, IFlexibility1
    {
        void IFlexibility1.Method()
        {
            Trace.WriteLine("I2");
        }
    }

しかし、それImpl2は「隠れているConcreteClass」という意味です。

しかし、一般的には、あなたが求めたことを実行できるとはどういう意味ですか?

于 2013-02-27T19:00:58.683 に答える