国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#3.0 中使用擴展方法來擴展接口

2019-11-18 16:32:11
字體:
來源:轉載
供稿:網友

前篇博客中我重點介紹了兩個特殊場景:

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

2、擴展方法的嵌套

現在我們來看擴展方法使用的第三個場景:使用擴展方法來擴展接口

 

應用場景舉例:

我們有時候會發現最初定義的一個接口,在現在環境下,這個接口需要再增加一個函數。有了擴展方法后,我們在這種情況下又多了一種實現的選擇。下面以代碼來說明這個問題:

namespace Hongjun.Guo
{
    interface MyInterface
    {
        void Test01();
    }

    public class MyClass : MyInterface
    {
        public void Test01()
        {
            Console.WriteLine("Test01");
        }
    }

    static class MyExtensionMethods
    {
        public static void MyTest002(this MyInterface ii)
        {
            ii.Test01();
        }

    }

}

 

調用方法:

using Hongjun.Guo;

static void Main(string[] args)
{
    MyInterface mm = new MyClass();
    mm.MyTest002();
    Console.ReadLine();
}

 

分析這樣做的好處:

1、如果我們實現 MyInterface 接口的類很多,這些類沒有派生關系,這時候我們要在接口上新增一個函數,按照以前的做法,這個接口的實現類有多少個,我們就需要改多少個,使用了擴展方法后,我們只需要改一個地方。減少代碼量。如果實現這個接口的類被封裝在不同的組件中,一些組件由于其他原因難以修改,這時候用擴展方法來擴展接口真是給我們一劑良藥呀;

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

3、擴展方法擴展的接口,與你自己實現這個接口的類中自己實現的函數重名時候的問題(這時候也可以簡單認為是這個類 override 了這個函數實現)。

先說結論:這兩個不存在沖突問題,你如果是接口調用,則是擴展方法,如果是實現類調用,則是實現類自己的方法,參看我前面博客對擴展方法跟原來類的方法重名時候的處理邏輯的描述,下面再以一段代碼來描述這個問題。

namespace Hongjun.Guo
{
    interface MyInterface
    {
        void Test01();
    }

    static class MyExtensionMethods
    {
        public static void MyTest002(this MyInterface ii)
        {
            ii.Test01();
        }

    }
    public class MyClass : MyInterface
    {
        public void Test01()
        {
            Console.WriteLine("Test01");
        }

        public void MyTest002()
        {
            Console.WriteLine("MyTest002");
        }
    }
}


調用代碼:

using Hongjun.Guo;

static void Main(string[] args)
{
    MyInterface mm = new MyClass();
    mm.MyTest002();
    Console.WriteLine("***********");
    ((MyClass)mm).MyTest002();

    Console.ReadLine();
}

這段代碼執行的結果是
Test01
***********
MyTest002

分析:

mm.MyTest002(); 這行代碼是接口調用,則使用的是擴展方法。

((MyClass)mm).MyTest002();  這行代碼調用者類型是MyClass ,MyClass  實現了MyTest002 函數,則不是擴展方法調用。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 诸暨市| 渑池县| 监利县| 新津县| 茂名市| 佳木斯市| 黑水县| 安岳县| 太湖县| 抚宁县| 西宁市| 红原县| 秦皇岛市| 浦江县| 丰原市| 阳春市| 新郑市| 昌黎县| 连平县| 通山县| 内丘县| 张家口市| 阿克陶县| 连州市| 定陶县| 洮南市| 达拉特旗| 潍坊市| 克什克腾旗| 青冈县| 张家川| 新龙县| 饶河县| 同仁县| 德惠市| 新宁县| 平原县| 井冈山市| 吴江市| 瑞金市| 昌图县|