原文: Default implementations in interfaces
隨着上周的 .NET Core 3.0 Prview 5 和 Visual 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