【问题标题】:Multiple interfaces with same methods name and overriding along a class hierarchy具有相同方法名称并沿类层次结构覆盖的多个接口
【发布时间】:2013-02-27 16:13:05
【问题描述】:

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

AbstractClass 是一个抽象类,实现:

  • IFlexibility1Method() 声明为抽象。
  • IFlexibility2Method2() 声明为虚拟。

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

现在,假设 IFlexibility1IFlexibility 接口提供具有相同签名的方法 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 问题是,如果您需要一组必须实现IFexibility1IFlexibility2 方法的类,您可以声明一个abstract class public class AbstractClass : IFlexibility1, IFlexibility2 { public abstract void Method(); },但是如果该方法的实现相同不适合这两个接口,那么实现者必须记住在每次创建派生类时添加这些接口。这不是最佳解决方案。

标签: c# uml


【解决方案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 的实现。

但是,一般来说;能够按照你的要求去做意味着什么?

【讨论】:

  • 我承认这是一个具体案例,但这是我心中的一个问题。有时您需要创建一个具有行为的类。即使您让子类实现,您也必须确保该类实现了一个接口。有时,您必须使用 2 个接口进行相同的操作。当接口有不同的方法时,没关系。显式实现很有用,但我想问是否可以与不同的方法名称做同样的事情。
  • @Sinan 您问“为什么不能让子类实现这些方法”,其中“这些方法”是显式接口实现。我已经详细说明了子类专门实现接口,而基类实现了。子类不能显式地实现它没有具体实现的接口成员。也许您可以更具体地提出您的问题?
  • "子类不能显式地实现它没有具体实现的接口成员" => 实际上,当你实现一个接口时,你可以将一个方法声明为抽象而不是实现它。因此,子类可以实现它。我同意没有虚拟或抽象,你不能那样做。 Java 的行为相同:如果您将实现类声明为抽象并且您不实现方法,那么子类可以实现它。你同意吗?但是,您是对的,正如我所说,显式 imp 不是私有的,所以我的“受保护”目的没有意义。
  • 是的,“显式实现接口成员”是指显式实现。你不能有抽象的隐式实现,因为只有一个类可以显式地实现一个成员。
  • 如果你想让派生类实现接口中的方法,为什么不在抽象类中将方法抽象化呢?您无法区分两个相同方法之间的区别,因为它们在两个接口之间共享。如果您想要实现两种不同的方法,那么具体类必须实现这两个接口以及抽象类。我看不出这和你问的有什么不同......
猜你喜欢
  • 2019-06-05
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多