本主题的目标不是询问如何使用相同的方法名实现两个接口。我问自己为什么我们不能使抽象或虚拟方法的显式实现。 这里很简单:
AbstractClass是一个实现的抽象类:
IFlexibility1
声明Method()
为抽象。IFlexibility2
声明Method2()
为虚拟。 ConcreteClass是一个AbstractClass,它实现了Method()和Method2()
。没关系!
现在,假设IFlexibility1
和IFlexibility
接口提供了具有相同签名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没有提供明确的实现。
答案 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
的实施。
但是,总的来说;能够做你所问的事情意味着什么?