使用new-keyword加入两个接口的方法

时间:2013-02-01 14:21:52

标签: c# .net explicit-interface

我有两个接口A,B(驻留在不同的组件中)。两者都声明具有相同签名的方法(MyMethod)。这两个接口由第三个接口(C)继承。

在前两个接口(A,B)中声明的方法旨在返回相同的值(对于A和B),因此,我不希望在从C派生时显式实现接口。
我通过在第三个界面中声明方法,同时使用new-keyword来实现这一点。

public interface A {
   MyType MyMethod();
}
public interface B {
   MyType MyMethod();
}

public interface C : A,B{
   new MyType MyMethod();
}

public class ImplementingClass : C{
   public MyType MyMethod(){
       // do somethin
       // return something
   }
}

这有什么问题可以预料到,还是这种不好的风格?

更新
对不起,我的初步问题没有显示完整的故事。问题出现了,当我尝试在C的接口引用上调用MyMethod时。编译器不会编译它。

 C aReferenceToC=new CImplementingClass();
 aReferenceToC.MyMethod(); // <<< Here the compiler will throw an exception

完整示例

C myCImplementationAsAnInterfaceReference = new MyCImplementation(); 
myCImplementationAsAnInterfaceReference.MyMethod(); // This does not compile without declaring MyMethod in C with the new-Keyword

MyCImplementation myCImplementationReference= new MyCImplementation(); 
myCImplementationReference.MyMethod(); // This however will always compile and run

public interface A {
        int MyMethod();
}
public interface B {
        int MyMethod();
}

public interface C : A, B {

}

public class MyCImplementation : C {

        public int MyMethod() {
            return 1;
        }
}

2 个答案:

答案 0 :(得分:1)

做你做的事,绝不会阻止人们提供A.MyMethodB.MyMethodC.MyMethod的不同实现。

  class TestABC : C
  {
    MyType C.MyMethod()
    {
      // 1
      return null;
    }

    MyType A.MyMethod()
    {
      // 2
      return null;
    }

    MyType B.MyMethod()
    {
      // 3
      return null;
    }
  }

new关键字无论如何都不会删除“隐藏”方法。它只是告诉编译器容忍这样一个事实,即类型现在有两个相同的签名方法,一个从基类继承,一个由当前类型声明。

编辑好的,鉴于问题的发展,我认为你的问题确实存在(我最初并不清楚):

你有这个设计:

public interface A {
   MyType MyMethod();
}
public interface B {
   MyType MyMethod();
}

public interface C : A,B{
}

您的问题是此代码无法编译:

C myInstance = CreateAnInstanceOfSomeClassImplementingC();
myInstance.MyMethod();  //  does not compile, ambiguous

你的问题是,如果摆脱编译器错误是一个很好的解决方案错误CS0121:以下方法或属性之间的调用是不明确的:[...] 引入{{1 } new中的成员。

对我来说,这看起来很难看。但我无法提出另一种解决方案(当您在评论中告知我C不能是C)时。接口无法指示继承的两个方法必须联合起来。

答案 1 :(得分:-1)

是否使用new关键字并不会真正改变任何内容。行为是一样的。

Testing testing = new Testing();
testing.MyMethod(); // calls Testing.MyMethod

AA testingA = new Testing();
testingA.MyMethod(); // calls AA.MyMethod


 public interface A
{
    int MyMethod();
}

public class AA : A
{

    public int MyMethod()
    {
        return 11;
    }
}

public interface B
{
    int MyMethod();
}

public interface C : A, B
{
    int MyMethod();
}

public class Testing : AA,C
{
    public int MyMethod()
    {
        return 10;
    }
}