C 3 0 中使用擴充套件方法來擴充套件介面

2021-04-13 02:21:55 字數 1386 閱讀 5835

有關擴充套件方法的一些知識點請參看我的前篇部落格:c#3.0 中的擴充套件方法 (extension methods)

前篇部落格中我重點介紹了兩個特殊場景:

1、擴充套件方法跟原來類的方法重名時候的處理邏輯

2、擴充套件方法的巢狀

現在我們來看擴充套件方法使用的第三個場景:使用擴充套件方法來擴充套件介面

應用場景舉例:

我們有時候會發現最初定義的乙個介面,在現在環境下,這個介面需要再增加乙個函式。有了擴充套件方法後,我們在這種情況下又多了一種實現的選擇。下面以**來說明這個問題:

namespace hongjun.guo

public class myclass : myinte***ce

} static class myextensionmethods

呼叫方法:

using hongjun.guo;

static void main(string args)

分析這樣做的好處:

1、如果我們實現 myinte***ce 介面的類很多,這些類沒有派生關係,這時候我們要在介面上新增乙個函式,按照以前的做法,這個介面的實現類有多少個,我們就需要改多少個,使用了擴充套件方法後,我們只需要改乙個地方。減少**量。如果實現這個介面的類被封裝在不同的元件中,一些元件由於其他原因難以修改,這時候用擴充套件方法來擴充套件介面真是給我們一劑良藥呀;

2、擴充套件方法被呼叫到,前提條件是擴充套件方法所在的命名空間被使用了。我們如果把介面跟擴充套件方法放到同乙個命名空間,擴充套件方法需要引用命名空間的問題就可以認為不存在了。因為你要用這個介面,必然會引用這個命名空間。

3、擴充套件方法擴充套件的介面,與你自己實現這個介面的類中自己實現的函式重名時候的問題(這時候也可以簡單認為是這個類 override 了這個函式實現)。

先說結論:這兩個不存在衝突問題,你如果是介面呼叫,則是擴充套件方法,如果是實現類呼叫,則是實現類自己的方法,參看我前面部落格對擴充套件方法跟原來類的方法重名時候的處理邏輯的描述,下面再以一段**來描述這個問題。

namespace hongjun.guo

static class myextensionmethods }

public class myclass : myinte***ce

public void mytest002()}}

呼叫**:

using hongjun.guo;

static void main(string args)

這段**執行的結果是

test01

***********

mytest002

分析:mm.mytest002(); 這行**是介面呼叫,則使用的是擴充套件方法。

((myclass)mm).mytest002();  這行**呼叫者型別是myclass ,myclass  實現了mytest002 函式,則不是擴充套件方法呼叫。

C 3 0 中使用擴充套件方法來擴充套件介面

有關擴充套件方法的一些知識點請參看我的前篇部落格 c 3.0 中的擴充套件方法 extension methods 前篇部落格中我重點介紹了兩個特殊場景 1 擴充套件方法跟原來類的方法重名時候的處理邏輯 2 擴充套件方法的巢狀 現在我們來看擴充套件方法使用的第三個場景 使用擴充套件方法來擴充套件介面...

C 3 0 中使用擴充套件方法來擴充套件介面 C 應用

前篇部落格中我重點介紹了兩個特殊場景 1 擴充套件方法跟原來類的方法重名時候的處理邏輯 2 擴充套件方法的巢狀 現在我們來看擴充套件方法使用的第三個場景 使用擴充套件方法來擴充套件介面 應用場景舉例 我們有時候會發現最初定義的乙個介面,在現在環境下,這個介面需要再增加乙個函式。有了擴充套件方法後,我...

使用擴充套件方法來擴充套件介面

不清楚擴充套件方法的清先預熱下 推薦 摘抄 1 擴充套件方法跟原來類的方法重名時候的處理邏輯 2 擴充套件方法的巢狀 現在我們來看擴充套件方法使用的第三個場景 使用擴充套件方法來擴充套件介面 應用場景舉例 我們有時候會發現最初定義的乙個介面,在現在環境下,這個介面需要再增加乙個函式。有了擴充套件方法...