[翻译] C# 8.0 接口默认实现

Posted rwing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[翻译] C# 8.0 接口默认实现相关的知识,希望对你有一定的参考价值。

原文: Default implementations in interfaces

随着上周的 .NET Core 3.0 Prview 5Visual Studio 2019 version 16.1 Preview 3 的发布,这个包含在 C# 8.0 中的最后一个主要特性在预览版中可用了。

软件发展的一大障碍是,无法将新成员添加到公共接口。这会破坏现有的接口实现者,因为他们没有为新成员做实现!

接口默认实现将帮助解决这个问题。现在接口成员将可以指定一个代码实现,如果实现类或结构体不提供该成员的实现,则不会发生错误,而是使用默认实现。

假设我们提供了以下接口:

interface ILogger
{
    void Log(LogLevel level, string message);
}

一个现有的类,可能存在于不同的库和不同的拥有者,实现 ILogger

class ConsoleLogger : ILogger
{
    public void Log(LogLevel level, string message) { ... }
}

现在,我们要添加另一个 Log 方法的重载到接口中。 我们可以在不破坏现有实现的情况下通过默认接口实现来做到这一点:

interface ILogger
{
    void Log(LogLevel level, string message);
    void Log(Exception ex) => Log(LogLevel.Error, ex.ToString());
}

ConsoleLogger 类仍然满足接口提供的约束,如果它被转换为接口并且调用了新的Log方法,它仍然可以正常工作,接口的默认实现就会被调用:

public static void LogException(ConsoleLogger logger, Exception ex)
{
    ILogger ilogger = logger; // Converting to interface
    ilogger.Log(ex);          // Calling new Log overload
}

当然,实现类也可以以自己的方式自由实现新的接口成员。在这种情况下,默认实现就会被忽略了。

了解默认实现的更多内容,请在 Microsoft Docs 上查看这个教程 Tutorial: Update interfaces with default interface members in C# 8

编码愉快!

Mads

以上是关于[翻译] C# 8.0 接口默认实现的主要内容,如果未能解决你的问题,请参考以下文章

C# 8.0 默认接口实现

C# 8: 默认接口方法

C#各版本新增加功能

是否可以动态编译和执行 C# 代码片段?

C# 8.0 之后接口已经不再单纯了,我懵逼了!

[译]C#8.0中一个使接口更加灵活的新特性-默认接口实现