C# 具有相同方法名称并沿类层次结构重写的多个接口

C# 具有相同方法名称并沿类层次结构重写的多个接口,c#,uml,C#,Uml,本主题的目标不是询问如何使用相同的方法名实现两个接口。我在问自己,为什么我们不能将抽象或虚拟作为方法的显式实现。 这里有一个简单的例子: AbstractClass是一个抽象类,它实现: IFlexibility1将Method()声明为抽象 IFlexibility2将Method2()声明为虚拟 ConcreteClass是一个抽象类,实现Method()和Method2()。很好 现在,假设IFlexibility1和IFlexibility接口提供的方法具有相同的签名voidmet

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

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

  • IFlexibility1
    Method()
    声明为抽象
  • IFlexibility2
    Method2()
    声明为虚拟
ConcreteClass是一个抽象类,实现Method()和
Method2()。很好

现在,假设
IFlexibility1
IFlexibility
接口提供的方法具有相同的签名void
method()
。如果我们想进行两种不同的实现,我们必须在AbstractClass中使用显式实现规则:

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

}

void IFlexibility2.Method()
{

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


我很好,这不是21世纪的问题。此外,我们通常不会实现两个匹配这种情况的接口。由于这些原因,Java不提供显式实现。

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


但是,总的来说;能够按照您的要求执行操作意味着什么?

事实上,受保护的抽象void IFlexibility1.Method()将非常有用。@Dzienny Define“有用”。抽象的显式实现没有任何意义。您基本上是说任何和所有派生类都需要实现所述接口。@Peter这样的构造需要抽象实现者为不同的接口声明不同的方法。这很有意义,因为它降低了程序员出错的风险。@Dzienny但只有从接口“派生”的东西才能显式实现这些接口成员。如果专门从接口派生,则不是从抽象类“派生”,而是专门实现接口,因此不能从抽象基“重写”抽象成员。为什么不直接执行:
public class AbstractClass:IFlexibility1{public abstract void Method();}
你还没有解释为什么这是不够的…@Peter问题是如果你需要一组必须实现
IFexibility1
IFlexibility2
方法的类,你可以声明一个
抽象类公共类抽象类:IFlexibility1,IFlexibility2{public abstract void Method();}
,但是,如果方法的同一个实现不适合两个接口,那么实现者必须记住在每次创建派生类时添加这些接口。这不是最佳解决方案。我承认这是一个具体的案例,但这是我心中的一个问题。有时你需要创建一个有行为的类。您必须确保类实现了一个接口,即使您允许实现子类。有时,您必须对2个接口进行相同的操作。当接口有不同的方法时,这是可以的。显式实现很有用,但我想问的是,是否可以对不同的方法名执行相同的操作。@Sinan您问“为什么不能让子类实现这些方法”,其中“这些方法”是显式接口实现。我已经详细说明了,子类没有具体实现接口,而基类实现了接口。子类不能显式实现它没有具体实现的接口成员。也许你可以更具体地回答你的问题?“子类不能显式地实现它没有具体实现的接口成员”=>实际上,当你实现一个接口时,你可以将一个方法声明为抽象的,而不是实现它。因此,子类可以实现它。我同意这一点,没有虚拟或抽象,你不能这样做。Java的行为是相同的:若您将实现类声明为抽象类,而并没有实现方法,那个么子类就可以实现它。你同意吗?然而,您是对的,显式imp并不像我说的那样是私有的,所以我的“受保护”目的是没有意义的。是的,我所说的“显式实现接口成员”是指显式实现。不能使用抽象隐式实现,因为只有一个类可以显式实现成员。如果希望派生类从接口实现方法,为什么不在抽象类中抽象该方法?您无法区分两个相同方法之间的区别,因为它们在两个接口之间共享。如果您想要实现两个不同的方法,那么具体类必须实现两个接口以及抽象类。我看不出这和你问的有什么不同。。。