覆盖接口中的函数

Kes*_*p K 1 c# overriding interface class multiple-inheritance

如何在继承两个接口的类中重写两个不同接口中具有相同名称和签名的函数。是否可以 ?
注:这是我被问到的一个面试问题。

例子:

interface example1
{
    int add(int a, int b);
}

interface example2
{
    int add(int a, int b);
}


public class cls : example1, example2
{
    public int add(int a, int b)
    {

        int c = a + b;
        return c;
    }
}
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nko 5

当我们有两个或多个具有相同方法的接口时,有多种选择:

我们可以使用显式接口实现:

public class cls : example1, example2 {
  // note abscence of "public", the method efficiently private
  int example1.add(int a, int b) => a + b;

   // note abscence of "public", the method efficiently private
  int example2.add(int a, int b) => Math.Abs(a) + Math.Abs(b);
}
Run Code Online (Sandbox Code Playgroud)

该调用想要转换到所需的接口:

var demo = new cls();

Console.Write($"{((example1)demo).add(2, -3)} : {((example2)demo).add(2, -3)}");
Run Code Online (Sandbox Code Playgroud)

如果我们有某种方法add作为默认行为(例如example1),我们只能使用显式接口实现example2

public class cls : example1, example2 {
  public int add(int a, int b) => a + b;

  int example2.add(int a, int b) => Math.Abs(a) + Math.Abs(b);
}
Run Code Online (Sandbox Code Playgroud)

现在,只有在以下情况下才需要调用example2

var demo = new cls();

Console.Write($"{demo.add(2, -3)} : {((example2)demo).add(2, -3)}");
Run Code Online (Sandbox Code Playgroud)

最后,如果两个接口共享相同的方法:

public class cls : example1, example2 {
  // Both interfaces example1 and example2 share the same method
  public int add(int a, int b) => a + b;
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能不应该使用 OP 的命名约定,因为这会让他们和将来遇到这种情况的其他人进一步感到困惑。OP 需要明白这里不涉及继承。 (2认同)