从具有相同方法名称的多个接口继承

时间:2010-03-03 12:30:13

标签: c# inheritance methods interface multiple-inheritance

如果我们有一个继承自多个接口的类,并且接口具有相同名称的方法,那么我们如何在我的类中实现这些方法?我们如何指定实现哪个接口的方法?

8 个答案:

答案 0 :(得分:89)

通过明确地实现接口,如下所示:

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();

答案 1 :(得分:10)

答案 2 :(得分:8)

您可以实现其中一个或两个接口explicitly

假设你有这些接口:

public interface IFoo1
{
    void DoStuff();
}

public interface IFoo2
{
    void DoStuff();
}

你可以这样实现:

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

    void IFoo2.DoStuff() { }        
}

答案 3 :(得分:3)

有时您甚至可能需要这样做:

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

    public void IFoo2.DoStuff()
    {
        ((IFoo1)this).DoStuff();
    }        
}

答案 4 :(得分:3)

  

您可以实施一个界面明确另一个实现

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");

答案 5 :(得分:2)

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();

答案 6 :(得分:2)

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
}

答案 7 :(得分:0)

答案是“ By using explicit Interface implementation

举个例子:

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();
    }

}

输出: 大家好 您好,所有B