亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在C# 8中如何使用默認接口方法詳解

 更新時間:2021年01月28日 09:15:17   作者:碼農(nóng)讀書  
這篇文章主要給大家介紹了關(guān)于在C# 8中如何使用默認接口方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

C# 8 中新增了一個非常有趣的特性,叫做 默認接口方法 (又稱虛擬擴展方法),這篇文章將會討論 C# 8 中的默認接口方法以及如何使用。

在 C# 8 之前,接口不能包含方法定義,只能在接口中定義方法簽名,還有一個就是接口的成員默認是 public 和 abstract , 在 C# 8 之前,接口不能包含字段,也不能包含private, protected, 或者 internal 的方法成員。如果你在接口中引入了一個新成員,默認情況下你必須更新實現(xiàn)該接口的所有子類。

在 C# 8 中可以在接口定義方法的默認實現(xiàn),而且還可以定義接口成員為 private,protect,甚至是 static,還有一點挺奇葩的,一個接口的 protect 成員是不能被實現(xiàn)類所訪問的,相反,它只能在子接口中被訪問,接口的 virtual 成員可以由派生接口 override,但不能被派生類 override,還有一點請注意,接口目前還不能定義 實例成員。

為什么要使用默認接口方法

所謂的 默認接口方法 指的是接口中定義了一個默認實現(xiàn)的方法, 如果實現(xiàn)該接口的類沒有實現(xiàn)默認接口方法的話,那么這個 默認接口方法 只能從接口上進行訪問,這是一個很有用的特性,因為它可以幫助開發(fā)人員在不破壞現(xiàn)有功能的情況下向接口的未來版本添加新方法。

考慮下面的 ILogger 定義。

 public interface ILogger
 {
 public void Log(string message);
 }

下面的兩個類擴展了ILogger接口并實現(xiàn)了Log()方法。

 public class FileLogger : ILogger
 {
 public void Log(string message)
 {
  //Some code
 }
 }

 public class DbLogger : ILogger
 {
 public void Log(string message)
 {
  //Some code
 }
 }

現(xiàn)在假設你想在ILogger接口中新增一個方法,該方法接受兩個參數(shù):一個 文本 一個 日志級別,下面的代碼片段展示了日志級別的枚舉類。

 public enum LogLevel
 {
 Info, Debug, Warning, Error
 }

修改后的 ILogger 接口如下:

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

好了,現(xiàn)在問題來了,因為 ILogger 中新增了一個 Log 方法,你必須要在所有實現(xiàn)該接口的所有子類中實現(xiàn) Log(string message, LogLevel logLevel) 方法,這就很尷尬了,如果不這樣做的話,編譯器肯定是不會放行的,在現(xiàn)實情況下,這個接口實現(xiàn)類可能在多個 dll 中,甚至在多個團隊中,可想而知,這個工作量是非常大并且非常痛苦的。

默認接口方法案例

這就是 默認接口方法 的應用場景,你可以在接口中定義一個默認方法是實現(xiàn),如下代碼所示:

 public interface ILogger
 {
 public void Log(string message);

 public void Log(string message, LogLevel logLevel)
 {
  Console.WriteLine("Log method of ILogger called.");
  Console.WriteLine("Log Level: "+ logLevel.ToString());
  Console.WriteLine(message);
 }
 }

這個時候,實現(xiàn) ILogger 接口的子類可以不實現(xiàn)新的 Log(string message, LogLevel logLevel) 方法,因此下面的代碼也是跑的通的,編譯器不會拋出任何錯誤。

 public class FileLogger : ILogger
 {
 public void Log(string message)
 {
  //Some code
 }
 }

 public class DbLogger : ILogger
 {
 public void Log(string message)
 {
  //Some code
 }
 }

默認接口方法不能被繼承

現(xiàn)在創(chuàng)建一個 FileLogger 類實例,然后直接調(diào)用新的帶參數(shù)的 Log() 方法,如下代碼所示:

FileLogger fileLogger = new FileLogger();
fileLogger.Log("This is a test message.", LogLevel.Debug);

從上面圖可看出 默認接口方法 不能被子類繼承,換句話說,子類根本就不知道接口中還有帶參數(shù)的 Log() 方法。

默認接口方法和菱形問題

現(xiàn)在有一個非常重要的問題,默認接口方法如何避免 菱形問題?換句話說就是 接口的 多繼承 問題,考慮下面的代碼清單。

 public interface A
 {
  public void Display();
 }

 public interface B : A
 {
  public void Display()
  {
   Console.WriteLine("Interface B.");
  }
 }

 public interface C : A
 {
  public void Display()
  {
   Console.WriteLine("Interface C.");
  }
 }

 public class MyClass : B, C
 {

 }

當編譯上面代碼時,會拋出一個編譯錯誤,說 MyClass 沒有實現(xiàn) A.Display() 方法,解決這個問題很簡單,在 MyClass 中實現(xiàn)一下接口方法就可以了,如下代碼所示:

 public interface A
 {
  public void Display();
 }
 public interface B : A
 {
  public void Display()
  {
   Console.WriteLine("Interface B.");
  }
 }
 public interface C : A
 {
  public void Display()
  {
   Console.WriteLine("Interface C.");
  }
 }
 public class MyClass : B, C
 {
  public void Display()
  {
   Console.WriteLine("MyClass.");
  }
 }

接下來就可以生成 MyClass 實例了,然后再調(diào)用 Display() 方法,如下代碼所示:

  static void Main(string[] args)
  {
   A obj = new MyClass();
   obj.Display();
   Console.Read();
  }

現(xiàn)在問題來了,到底是哪一個 Display() 方法被調(diào)用了呢?為了避免歧義,C# 將會使用最近覆蓋規(guī)則,即 Class.Display() 方法被最先調(diào)用。

抽象類 VS 接口

到這里,我想你肯定有疑問,抽象類 和 接口 是不是很相似了,甚至可以互換了?雖然抽象類和接口現(xiàn)在看起來在很多方面都很相似,但兩者之間還是有微妙的區(qū)別的,具體如下:

  • 抽象類可以有實例成員,接口則不能。
  • 抽象類不能多繼承,接口還是可以的。

默認接口方法 允許開發(fā)人員利用 trait 編程技術(shù),該技術(shù)可以讓那些附屬于該方法的不相關(guān)類型得以繼續(xù)使用,可能你有點懵,我舉個例子:假設你構(gòu)建好了一個dll,被很多的開發(fā)人員所使用,現(xiàn)在你要發(fā)布該 dll 的新版本,比如說往接口中添加了新方法,這個時候你可以定義默認實現(xiàn),這樣就可以對已使用的開發(fā)者進行無感升級。

譯文鏈接:https://www.infoworld.com/article/3455239/how-to-use-default-interface-methods-in-csharp-8.html

總結(jié)

到此這篇關(guān)于在C# 8中如何使用默認接口方法的文章就介紹到這了,更多相關(guān)C#8使用默認接口方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vs2019 實現(xiàn)C#調(diào)用c++的dll兩種方法

    vs2019 實現(xiàn)C#調(diào)用c++的dll兩種方法

    這篇文章主要介紹了vs2019 實現(xiàn)C#調(diào)用c++的dll兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • C# Winfom 中ListBox的簡單用法詳解

    C# Winfom 中ListBox的簡單用法詳解

    這篇文章主要介紹了C# Winfom 中ListBox的簡單用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Unity實現(xiàn)批量Build打包詳解

    Unity實現(xiàn)批量Build打包詳解

    一般來講如果項目是PC或Android、IOS端不會有批量Build打包這樣的需求,但如果項目是WebGL端可能會遇到這樣的需求。本文主要為大家介紹Unity中如何實現(xiàn)Build批量打包的,需要的朋友可以參考一下
    2021-12-12
  • c#隊列Queue學習示例分享

    c#隊列Queue學習示例分享

    隊列Queue,先進先出,先生產(chǎn)的貨物先出貨,后生產(chǎn)的貨物后出貨,下面看示例學習c#隊列Queue
    2013-12-12
  • C#監(jiān)測IPv4v6網(wǎng)速及流量的實例代碼

    C#監(jiān)測IPv4v6網(wǎng)速及流量的實例代碼

    這篇文章主要介紹了C#監(jiān)測IPv4v6網(wǎng)速及流量的實例代碼,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C#可用于登錄驗證碼的四位隨機數(shù)生成方法

    C#可用于登錄驗證碼的四位隨機數(shù)生成方法

    這篇文章主要介紹了C#可用于登錄驗證碼的四位隨機數(shù)生成方法,提供了兩種生成四位隨機數(shù)的方法供大家參考,是非常實用的技巧,需要的朋友可以參考下
    2014-12-12
  • C#探秘系列(三)——StackTrace,Trim

    C#探秘系列(三)——StackTrace,Trim

    這個系列我們看看C#中有哪些我們知道,但是又不知道怎么用,又或者懶得去了解的東西,比如這篇我們要介紹的StackTrace,Trim
    2014-05-05
  • C#使用doggleReport生成pdf報表的方法

    C#使用doggleReport生成pdf報表的方法

    這篇文章主要介紹了C#使用doggleReport生成pdf報表的方法,結(jié)合實例形式分析了C# doggleReport安裝及使用具體操作技巧,需要的朋友可以參考下
    2017-06-06
  • C#中創(chuàng)建PDF網(wǎng)格并插入圖片的方法

    C#中創(chuàng)建PDF網(wǎng)格并插入圖片的方法

    這篇文章我將向大家演示如何以編程的方式在PDF文檔中創(chuàng)建一個網(wǎng)格,并將圖片插入特定的網(wǎng)格中。對c# pdf 網(wǎng)格 插入圖片的知識感興趣的朋友一起看看吧
    2016-11-11
  • WPF實現(xiàn)能自由改變形狀的四邊形和六邊形

    WPF實現(xiàn)能自由改變形狀的四邊形和六邊形

    這篇文章主要為大家詳細介紹了WPF如何實現(xiàn)能自由改變形狀的四邊形和六邊形,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-03-03

最新評論