将通用方法添加到继承自 C# 接口的 类?

Add common method to classes inheriting from a C# Interface?

我有这样一个界面:

    public interface ITestInterface
    {
        int a { get; set; }

        void DoSomething();
    }

我的一些 classes 是从这个接口派生的:

    public class OneClass : ITestInterface
    {
        public int a { get; set; }

        public void DoSomething()
        {
            Console.WriteLine(this.a.ToString());
        }
    }

    public class AnotherClass : ITestInterface
    {
        public int a { get; set; }

        public void DoSomething()
        {
            Console.WriteLine((this.a * 2).ToString());
        }
    }

由于我现在需要一个(大型)通用方法用于从我的接口派生的所有 classes,我试图为此提供一个额外的基础 class:

 public class MyBaseClass
    {
        public void LargeCommonMethod()
        {
            Console.WriteLine((this.a * 3).ToString()); // no 'a' on base class
        }
    }

这显然行不通,因为基础 class 也需要实现我的接口才能了解 a 字段。

我现在问自己最好的方法是什么:

如果您需要方法的基本实现,那么接口显然不是可行的方法。

我会选择一个抽象的 class 来代替接口。基本不用把设计复​​杂化。

C# 8 为这种情况提供了一个特性。

  • 你的class都实现了一个接口
  • 你想给接口添加一个方法
  • 您不希望对所有现有 class 进行重大更改。如果您向接口添加一个方法,所有 classes 都会中断,除非您找到某种方法将方法添加到所有这些方法。 (这包括将它们全部修改为从新的基础继承 class。)

该功能是默认接口方法

您可以将您的方法和默认实现添加到接口:

public interface ITestInterface
{
    int a { get; set; }

    void DoSomething();

    void LargeCommonMethod()
    {
        Console.WriteLine((this.a * 3).ToString());
    }
}

实现接口的现有 classes 不会中断。当转换为接口时,您将能够调用接口中定义的方法。您仍然可以修改任何 class 以提供其自己的实现,覆盖接口的默认实现。

要使方法可用,必须将对象转换为接口 - ITestInterface

很多开发人员 - 包括我自己 - 发现这是一个奇怪的功能。但这是它的场景。

Some documentation

The most common scenario is to safely add members to an interface already released and used by innumerable clients.