使用c#中的扩展方法实现接口

本文关键字:方法 实现 接口 扩展 使用 | 更新日期: 2023-09-27 17:53:22

我有一个接口:

public interface IMessager
{
    void ShowMessage();
}

是否有任何方法来实现这个接口使用扩展方法?

public static class Extensions
{
  public static void ShowMessage(this MyClass e)
  {
      Console.WriteLine("Extension");
  }
}

和实现它的类:

public class MyClass:IMessager
{
    public void ShowMessage()
    {
        ShowMessage(); // I expect that program write "Extension" in console
    }
}

但是当我运行程序时,我得到了System.StackOverflowException

使用c#中的扩展方法实现接口

你发布的代码只是一个递归调用自己的方法(因此StackOverflowException)。

我不完全确定你想要完成什么,但我要回答你的问题

是否有任何方法来实现这个接口使用扩展方法?

如果你的目标是只在你有几个选项的时候编写你的方法,那么要更务实一点:

1。显式调用扩展名

public class MyClass:IMessager
{
    public void ShowMessage()
    {
        Extensions.ShowMessage(this);
    }
}

虽然在注释中已经指出,但这基本上违背了使用扩展方法的意义。此外,还有"锅炉板代码";这样,每次实现接口时,都必须从方法内部调用静态方法(不是很DRY)

2。使用抽象类代替接口

public abstract class MessengerBase
{
    public void ShowMethod() { /* implement */ }
}
public class MyClass : MessengerBase {}
...
new MyClass().ShowMethod();

这样做的问题是,你不能从多个类继承。

3。在接口上使用扩展

public interface IMessenger { /* nothing special here */ }
public class MyClass : IMessenger { /* also nothing special */ }
public static class MessengerExtensions
{
    public static void ShowMessage(this IMessenger messenger)
    {
        // implement
    }
}
...
new MyClass().ShowMessage();