如何使用C#调用带有默认实现的接口方法

3

我有以下接口和类:

interface IMyInterface
{
    void A();
   
    void B() 
    { 
        Console.WriteLine("B"); 
    } 
}

class MyClass : IMyInterface
{
    public void A()
    {
        Console.WriteLine("A");
    }
}

我想实例化MyClass并调用B(),代码如下:

MyClass x = new MyClass();
x.B();

但是,由于MyClass不包含'B'的定义,所以这个方法不起作用。是否有什么我可以添加到MyClass中,使得此代码调用IMyInterface中B()的默认实现?

我知道下面的代码可以工作,但我不想将数据类型从MyClass更改为IMyInterface。

IMyInterface x = new MyClass();
x.B();

2
不,你没办法做到。默认实现并不是这么工作的。它们并没有为类添加任何内容。你可以继承一个提供该方法的基类,但是接口并不会通过类引用使该方法可用。 - Lasse V. Karlsen
1
@LasseV.Karlsen 这真的很不幸。这就是其他语言(如 Kotlin)中默认实现的工作方式。 - tronman
3个回答

2
也许这有点取巧,但是您可以使用类扩展将B()方法添加到实现IMyInterface接口的每个类中。
static class ImplIMyInterface
{
    public static void B(this IMyInterface obj) => obj.B();
}

现在您可以在MyClass的实例上调用B()。

2
您可以这样调用它:
MyClass x = new MyClass();
(x as IMyInterface).B();

1

你不能这样做。你必须实现你的类从中继承的接口。但是你可以使用抽象类代替接口。像这样:

 abstract class MyAbstract
{
    public void A() { }

   public void B()
    {
        Console.WriteLine("B");
    }
}

class MyClass : MyAbstract
{
    public new void A()
    {
        Console.WriteLine("A");
    }
}

var x = new MyClass();
    x.B();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接