如何在C#中使类和记录共享同一个方法?

4

我有一个遗留类ExampleClass和它的继承者,一个记录ExampleRecord。 两者都实现了接口IExample,该接口要求一个方法ExampleMethod

是否可能让这个类和记录使用相同的方法代码? 如果可以,怎么做?


1
有几个选项。这个方法做什么? - Panagiotis Kanavos
2个回答

7

选项 #1: 扩展方法: 将常用方法作为扩展方法添加到接口中。这样,它既不属于类,也不属于记录,而是自由浮动的;任何可以访问接口的代码也应该被赋予访问扩展方法的权限。

选项 #2: 默认接口方法: 升级到 C# 语言版本 8.0 或以上,然后将常用方法设置为默认接口方法。(参见https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods) 这使得事情变得更加简单:任何可以访问类或记录的代码都自动具有访问默认接口方法的权限。

当然,这些方法只适用于完全依赖于接口提供的功能而不依赖其他内容的方法。


5

这取决于这个方法在做什么。为什么不使用一个拥有这个方法的第三个类呢?然后你可以在类和记录中拥有它的实例并调用它。

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()
    {
       // ...
    }
}

另一种方法是使用自C#8以来可用的默认接口实现
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();

正如您所看到的,您需要对接口进行显式转换,否则它将无法编译。为什么?


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