4

本主题的目的不是要问如何实现两个具有相同方法名称的接口。我在问自己为什么我们不能让抽象或虚拟成为方法的显式实现。这里有一个简单的:

简单的类层次结构

AbstractClass 是一个抽象类,它实现:

  • IFlexibility1通过声明Method()为抽象。
  • IFlexibility2通过声明Method2()为虚拟。

ConcreteClass 是一个 AbstractClass 并实现 Method() 和Method2(). 没关系 !

现在,假设IFlexibility1IFlexibility接口提供具有相同签名的方法 void Method()。如果我们想要做两个不同的实现,我们必须在 AbstractClass 中使用显式的实现规则:

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

}

void IFlexibility2.Method()
{

}

这是我的问题:为什么不能像第一种情况那样让子类实现这些方法。事实上,我们不能声明一个虚拟的 void IFlexibility1.Method()或一个抽象的 void IFlexibility2.Method(),这是逻辑,因为这些方法是私有的。但我认为以下语法可能是正确的protected abstract void IFlexibility1.Method()。你怎么看 ?

我很好,这不是 21 世纪的问题。此外,我们通常不会实现与这种情况相匹配的两个接口。由于这些原因,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 回答