[翻譯] C# 8.0 介面預設實現
阿新 • • 發佈:2019-05-16
原文: 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
編碼愉快!
M