-1

2 つのインターフェイス A、B があります (異なるコンポーネントに存在します)。どちらも同じシグネチャ ( MyMethod) でメソッドを宣言します。2 つのインターフェイスは、3 番目のインターフェイス (C) によって継承されます。

最初の 2 つのインターフェイス (A、B) で宣言されているメソッドは、(A と B に対して) 常に同じ値を返すことを意図しているため、C から派生するときにインターフェイスを明示的に実装したくありません。
これを達成します。 new-keyword を使用しながら、3 番目のインターフェイスでもメソッドを宣言します。

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.MyMethod、およびの異なる実装を提供することを決して止めませんC.MyMethod

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

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

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

とにかく、newキーワードは「隠し」メソッドを削除しません。型に同じシグネチャを持つ 2 つの同一のメソッドがあり、1 つは基本型から継承され、もう 1 つは現在の型によって宣言されているという事実を許容するようにコンパイラに指示するだけです。

編集: OK、あなたの質問の発展を考えると、ここにあなたの問題が本当にあったと思います(これは最初は私にはわかりませんでした):

あなたはこのデザインを持っていました:

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: [...]を取り除くための適切な解決策であるかどうかnewですC

私には醜いように思えます。しかし、私は別の解決策を思いつくことができません(あなたがコメントで私に知らせたとき、それCclass. 継承された 2 つのメソッドを結合する必要があることをインターフェイスが指示する方法はありません。

于 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 に答える