多个接口具有相同的方法名称并覆盖类层次结构

时间:2013-02-27 16:13:06

标签: c# uml

本主题的目标不是询问如何使用相同的方法名实现两个接口。我问自己为什么我们不能使抽象或虚拟方法的显式实现。 这里很简单:

Simple class hierarchy

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() abstract void IFlexibility2.Method(),因为这些方法是私有的。但我认为以下语法可能是正确的 protected abstract void IFlexibility1.Method()。你觉得怎么样?

我没关系,这不是21世纪的问题。此外,我们通常不会实现两个与此案例相匹配的接口。由于这些原因,Java没有提供明确的实现。

1 个答案:

答案 0 :(得分:1)

显式接口实现既不是私有的也不是公共的。它们只是通过定义的接口实例公开访问。从实现接口本身的类派生的类不实现接口,因此无法显式实现接口的成员,因此派生类不能覆盖该成员(出于同样的原因,显式实现不能声明为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的实施。

但是,总的来说;能够做你所问的事情意味着什么?