應用場景舉例:
我們有時候會發現最初定義的一個接口,在現在環境下,這個接口需要再增加一個函數。有了擴展方法後,我們在這種情況下又多了一種實現的選擇。下面以代碼來說明這個問題:
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 函數,則不是擴展方法調用。