将通用方法添加到继承自 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
字段。
我现在问自己最好的方法是什么:
- 使
MyBaseClass
继承自 ITestInterface
?
- 将
LargeCommonMethod()
设置为 protected
并通过参数提供它使用的所有内部数据? (实际上有很多这样的..)
- 一直跳过界面并用抽象基础替换它class?
- ...?
如果您需要方法的基本实现,那么接口显然不是可行的方法。
我会选择一个抽象的 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
。
很多开发人员 - 包括我自己 - 发现这是一个奇怪的功能。但这是它的场景。
The most common scenario is to safely add members to an interface already released and used by innumerable clients.
我有这样一个界面:
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
字段。
我现在问自己最好的方法是什么:
- 使
MyBaseClass
继承自ITestInterface
? - 将
LargeCommonMethod()
设置为protected
并通过参数提供它使用的所有内部数据? (实际上有很多这样的..) - 一直跳过界面并用抽象基础替换它class?
- ...?
如果您需要方法的基本实现,那么接口显然不是可行的方法。
我会选择一个抽象的 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
。
很多开发人员 - 包括我自己 - 发现这是一个奇怪的功能。但这是它的场景。
The most common scenario is to safely add members to an interface already released and used by innumerable clients.