【发布时间】:2013-02-27 16:13:05
【问题描述】:
本主题的目的不是要问如何实现两个具有相同方法名的接口。我在问自己为什么我们不能让抽象或虚拟成为方法的显式实现。 这里简单说一下:
AbstractClass 是一个抽象类,实现:
-
IFlexibility1将Method()声明为抽象。 -
IFlexibility2将Method2()声明为虚拟。
ConcreteClass 是一个 AbstractClass 并实现 Method() 和 Method2()。没关系!
现在,假设 IFlexibility1 和 IFlexibility 接口提供具有相同签名的方法 void Method()。如果我们想要做两个不同的实现,我们必须在 AbstractClass 中使用显式的实现规则:
// Two explicit privates methods
void IFlexibility1.Method()
{
}
void IFlexibility2.Method()
{
}
这是我的问题:为什么不能像第一种情况那样让子类实现这些方法。事实上,我们不能声明 virtual void IFlexibility1.Method() 或 abstract void IFlexibility2.Method(),因为这些方法是私有的,所以这是合乎逻辑的。但我认为以下语法可能是正确的protected abstract void IFlexibility1.Method()。你怎么看?
我很好,这不是 21 世纪的问题。此外,我们通常不会实现与这种情况相匹配的两个接口。由于这些原因,Java 没有提供显式实现。
【问题讨论】:
-
确实,protected abstract void IFlexibility1.Method() 会很有用。
-
@Dzienny 定义“有用”。抽象的显式实现没有任何意义。您基本上是在说任何和所有派生类都需要实现所述接口。
-
@Peter 这样的结构需要抽象实现者为不同的接口声明不同的方法。这很有意义,因为它降低了程序员出错的风险。
-
@Dzienny 但只有从接口“派生”的东西才能显式实现这些接口成员。如果您专门从接口派生,则您不是从抽象类“派生”,而是现在专门实现接口,因此不能从抽象基中“覆盖”抽象成员。为什么不这样做:
public class AbstractClass : IFlexibility1 { public abstract void Method(); }你还没有解释为什么这还不够...... -
@Peter 问题是,如果您需要一组必须实现
IFexibility1和IFlexibility2方法的类,您可以声明一个abstract class public class AbstractClass : IFlexibility1, IFlexibility2 { public abstract void Method(); },但是如果该方法的实现相同不适合这两个接口,那么实现者必须记住在每次创建派生类时添加这些接口。这不是最佳解决方案。