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


Answers:


99

通过显式实现接口,如下所示:

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

如果Test()在接口和Dual类中都声明为公共,该怎么办?
RSK 2014年

5
接口上的方法/属性始终是公共的-这是接口的整个要点。但是,当您使用显式接口实现时,该函数将始终在类上是私有的。这就是为什么需要将类转换为所需的特定接口的技术的原因。当您实现两个定义具有相同签名的方法的接口时,就无法避免这一点。
皮特2014年

请注意,此方法的另一个微妙的“功能”是,即使每个方法具有相同的方法签名,也可以具有不同的返回类型。如果您不对除一种方法之外的所有方法或所有方法使用显式接口声明,则通常不允许这样做。
NightOwl888 '18

@RSK如果在Dual类中声明了Test(),则两个接口都将使用它作为实现。您将无法同时拥有其他两个显式实现。
ΕГИІИО


8

您可以显式实现这些接口之一或全部。

假设您具有以下接口:

public interface IFoo1
{
    void DoStuff();
}

public interface IFoo2
{
    void DoStuff();
}

您可以这样实现:

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

    void IFoo2.DoStuff() { }        
}

4

您可以实现明确一个接口另一个implecitely

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

有时您甚至可能需要执行以下操作:

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

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

与创建具有正确接口类型的临时文件有关吗?不用了,谢谢。readonly IFoo1 this1 = this; this1.DoStuff();
Thomas Eding

3
在显式接口实现中包含代码的可继承类通常会给派生类带来麻烦。我建议作为一种替代模式,该protected方法具有一个同时包含两个接口成员代码的方法,并且两个接口成员都链接到该方法。this为了使用其成员而强制转换为接口类型通常会产生明显的代码异味。最好有一种protected方法来实现所讨论的成员并链接到该成员。
2014年

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

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
}

1

答案是“通过使用显式接口实现

举一个例子:

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

}

输出:向所有A问候

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.