web-dev-qa-db-ja.com

同じメソッド名を持つ複数のインターフェースからの継承

複数のインターフェイスから継承するクラスがあり、インターフェイスに同じ名前のメソッドがある場合、これらのメソッドをクラスに実装するにはどうすればよいですか?どのインターフェイスのどのメソッドが実装されているかをどのように指定できますか?

65
masoud ramezani

次のように、インターフェイスを明示的に実装することにより:

public interface ITest {
    void Test();
}
public interface ITest2 {
    void Test();
}
public class Dual : ITest, ITest2
{
    void ITest.Test() {
        Console.WriteLine("ITest.Test");
    }
    void ITest2.Test() {
        Console.WriteLine("ITest2.Test");
    }
}

明示的なインターフェイス実装を使用する場合、関数はクラスでパブリックではありません。したがって、これらの関数にアクセスするには、最初にオブジェクトをインターフェース型にキャストするか、インターフェース型で宣言された変数に割り当てる必要があります。

var dual = new Dual();
// Call the ITest.Test() function by first assigning to an explicitly typed variable
ITest test = dual;
test.Test();
// Call the ITest2.Test() function by using a type cast.
((ITest2)dual).Test();
93
Pete

explicit interface implementation を使用する必要があります

10
Gopher

これらのインターフェースの一方または両方を実装できます explicitly

次のインターフェースがあるとしましょう:

public interface IFoo1
{
    void DoStuff();
}

public interface IFoo2
{
    void DoStuff();
}

次のように両方を実装できます。

public class Foo : IFoo1, IFoo2
{
    void IFoo1.DoStuff() { }

    void IFoo2.DoStuff() { }        
}
8
Mark Seemann

1つのインターフェイスを明示的におよび別の実装を実装できます。

public interface ITest {
    void Test();
}
public interface ITest2 {
    void Test();
}
public class Dual : ITest, ITest2
{
    public void Test() {
        Console.WriteLine("ITest.Test");
    }
    void ITest2.Test() {
        Console.WriteLine("ITest2.Test");
    }
}

ITest.Testデフォルトの実装ですになります

Dual dual = new Dual();
dual.Test();
((ITest2)dual).Test();

出力:

Console.WriteLine("ITest.Test");
Console.WriteLine("ITest2.Test");
3
Bimal Das

時にはあなたがする必要さえあるかもしれません:

public class Foo : IFoo1, IFoo2
{
    public void IFoo1.DoStuff() { }

    public void IFoo2.DoStuff()
    {
        ((IFoo1)this).DoStuff();
    }        
}
3
Sebastian
public interface IDemo1
{
 void Test();
}
public interface IDemo2
{
 void Test();
}
public class clsDerived:IDemo1,IDemo2
{
  void IDemo1.Test() 
  {
   Console.WriteLine("IDemo1 Test is fine");
  }
 void IDemo2.Test() 
  {
    Console.WriteLine("IDemo2 Test is fine");
  }
}

public void get_methodes()
{
    IDemo1 obj1 = new clsDerived();
    IDemo2 obj2 = new clsDerived();
    obj1.Test();//Methode of 1st Interface
    obj2.Test();//Methode of 2st Interface
}
2
Ranajit kumar
public class ImplementingClass : AClass1, IClass1, IClass2

    {
        public override string Method()
        {
            return "AClass1";
        }
        string IClass1.Method()
        {
            return "IClass1";
        }
         string IClass2.Method()
        {
            return "IClass2";
        }
    }

そのため、異なるクラスから呼び出す場合、オブジェクトを必要なInterfaceクラスまたはAbstractクラスに型キャストする必要があります。

ImplementingClass implementingClass = new ImplementingClass();
((AClass1)implementingClass).Method();
2
Rohit.P

答えは「 明示的なインターフェイス実装を使用して

一例を挙げましょう:

using System;

interface A

{
        void Hello();
}

interface B

{
    void Hello();
}


class Test : A, B

{
    void A.Hello()

    {
        Console.WriteLine("Hello to all-A");
    }

    void B.Hello()
    {
        Console.WriteLine("Hello to all-B");

    }

}

public class interfacetest

{
    public static void Main()

    {
        A Obj1 = new Test();

        Obj1.Hello();

        B Obj2 = new Test();

        Obj2.Hello();
    }

}

出力:Hello to all-A Hello to all-B

0
Vinayak Savale