我有一个遗留类ExampleClass
和它的继承者,一个记录ExampleRecord
。
两者都实现了接口IExample
,该接口要求一个方法ExampleMethod
。
是否可能让这个类和记录使用相同的方法代码? 如果可以,怎么做?
选项 #1: 扩展方法: 将常用方法作为扩展方法添加到接口中。这样,它既不属于类,也不属于记录,而是自由浮动的;任何可以访问接口的代码也应该被赋予访问扩展方法的权限。
选项 #2: 默认接口方法: 升级到 C# 语言版本 8.0 或以上,然后将常用方法设置为默认接口方法。(参见https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods) 这使得事情变得更加简单:任何可以访问类或记录的代码都自动具有访问默认接口方法的权限。
当然,这些方法只适用于完全依赖于接口提供的功能而不依赖其他内容的方法。
这取决于这个方法在做什么。为什么不使用一个拥有这个方法的第三个类呢?然后你可以在类和记录中拥有它的实例并调用它。
public interface IExample
{
void Foo();
}
public class ExampleClass: IExample
{
private ExampleService service;
public void Foo() => service.Foo();
}
public record ExampleRecord : IExample
{
private ExampleService service;
public void Foo() => service.Foo();
}
public class ExampleService
{
public void Foo()
{
// ...
}
}
public interface IExample
{
void Foo()
{
// ...
}
}
public class ExampleClass: IExample
{
}
public record ExampleRecord : IExample
{
}
ExampleClass ec = new();
ExampleRecord er = new();
((IExample)ec).Foo();
((IExample)er).Foo();
正如您所看到的,您需要对接口进行显式转换,否则它将无法编译。为什么?