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

mas*_*ani 66 c# methods inheritance interface multiple-inheritance

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

Pet*_*ete 94

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

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

使用显式接口实现时,该类的函数不公开.因此,为了访问这些函数,您必须首先将对象强制转换为接口类型,或将其分配给声明为接口类型的变量.

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();
Run Code Online (Sandbox Code Playgroud)

  • 接口上的方法/属性始终是公共的 - 这是接口的整个点.但是当你使用_explicit接口implementation_时,该函数将始终在类上是私有的.这就是为什么您需要使用该技术将类转换为您需要的特定接口的原因.当您实现两个定义具有相同签名的方法的接口时,您无法避免这种情况. (5认同)

Mar*_*ann 8

您可以显式实现其中一个或两个接口.

假设你有这些接口:

public interface IFoo1
{
    void DoStuff();
}

public interface IFoo2
{
    void DoStuff();
}
Run Code Online (Sandbox Code Playgroud)

你可以这样实现:

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

    void IFoo2.DoStuff() { }        
}
Run Code Online (Sandbox Code Playgroud)


Bim*_*Das 7

您可以显式实现一个接口,并隐式实现另一个接口

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

ITest.Test将是默认实现。

Dual dual = new Dual();
dual.Test();
((ITest2)dual).Test();
Run Code Online (Sandbox Code Playgroud)

输出:

Console.WriteLine("ITest.Test");
Console.WriteLine("ITest2.Test");
Run Code Online (Sandbox Code Playgroud)