-1

我有两个接口 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;
        }
}
4

2 回答 2

1

做你所做的,并不会以任何方式阻止人们给出不同的A.MyMethod,B.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: The call is ambiguous between the following methods or properties: [...]通过newC.

在我看来,这很丑陋。C但是我无法想出另一个解决方案(当您在评论中告诉我时class)。接口没有办法规定继承的两个方法必须结合在一起。

于 2013-02-01T14:50:00.097 回答
-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;
    }
}
于 2013-02-01T14:31:28.703 回答