OK本篇文章繼續講到第二天尾身課程內容
這次要來講所謂的擴充方法
相信有再寫LINQ的朋友們
對擴充方法吧應該都不陌生
常用的.Where( ) 就是擴充方法了
今天要來教大家怎麼撰寫擴充方法
public static class TEST
{
public static string tostring(this int value)
{ //第一個參數必須是this 而且也只能有一個
return value.ToString();//內容依據自己所需要的情竟撰寫
//這邊只是範例僅供參考
}
static void Main(string[] args)
{
int i = 5555;
i.tostring(); //.tostring()擴充方法
}
這邊可以直接看到Visual studio 直接告訴你是擴充方法,不須重新編譯就可以看到了
接下來帶大家看,擴充方法的使用情境方式跟一般方法的使用情境方式
namespace ExtensionSample02
{
public class InstanceClass
{
public void ShowText()
{
Console.WriteLine("Form instance method");
}
}
public static class ExtensionClass
{
public static void ShowText(this InstanceClass value)
{
Console.WriteLine("Form extension method");
}
}
}
static void Main(string[] args)
{
//非靜態類別的非靜態方法 必須new 出執行個體才可叫用
InstanceClass obj = new InstanceClass();
obj.ShowText();
//可以使用靜態類別在叫擴充方法
ExtensionClass.ShowText(obj);
Console.ReadLine();
//直接呼叫擴充方法
obj.ShowText();
}
介面
1、一個類別可以實作多個介面
2、介面可以繼承介面
3、介面也可以讓抽象類別繼承
4、介面不能定義執行個體欄位與建構式
5、不允許在介面中定義靜態成員
6、介面的設計要儘量簡單
7、介面實作有2種,一種是實做介面,一種是明確實作介面 (兩個是不一樣的哦!!!很重要)
1、一個類別可以實作多個介面
2、介面可以繼承介面
3、介面也可以讓抽象類別繼承
4、介面不能定義執行個體欄位與建構式
5、不允許在介面中定義靜態成員
6、介面的設計要儘量簡單
7、介面實作有2種,一種是實做介面,一種是明確實作介面 (兩個是不一樣的哦!!!很重要)
namespace InterfaceSample02
{
// 宣告一個介面,裡面定義了一個GetString方法
public interface IPublic
{
String GetString();
}
//明確實作介面
public class ImplementIPublic : IPublic
{
string IPublic.GetString()
{
return "明確實作 ";
}
}
// 此介面宣告方法與 IPublic 同名
public interface IProtected
{
String GetString();
}
//如果類別實作了兩個包含相同簽章之成員的介面,則在類別上實作該成員會導致兩個介面都將該成員當做實作 (Implementation) 使用
//所以這時候IPublic或IProtected 背後的實作方法都匯回傳"Comman"
public class ImplementIPublicProtected : IPublic, IProtected
{
public string GetString()
{
return ("Comman");
}
}
// 實作 IPublic, 明確實作 IProtected
// 這時候實作,跟明確實作的差異就出來囉
// 當new ImplementIPublicProtectedX 這個類別的時候
// 如果想要呼叫到string IProtected.GetString()
// 變數名稱一定要轉型成IProtected 才有辦法呼叫到哦!!!
public class ImplementIPublicProtectedX : IPublic, IProtected
{
public string GetString()
{
return ("public");
}
string IProtected.GetString()
{
return ("protected");
}
}
// 類別另外實做 GetString(0, IPublic, IProtected 明確實作
public class ImplementIPublicProtectedY : IPublic, IProtected
{
public string GetString()
{
return ("common");
}
string IProtected.GetString()
{
return ("protected");
}
string IPublic.GetString()
{
return ("public");
}
}
}
接著我們來看Clinet端的程式
static void Main(string[] args)
{
ImplementIPublicProtectedX x = new ImplementIPublicProtectedX();
Console.WriteLine(x.GetString()); // 這邊會回傳Public
Console.WriteLine(((IProtected)x).GetString()); // 這邊明確轉型要呼叫 IProtected.GetString()
// 所以會回傳protected
ImplementIPublic obj = new ImplementIPublic();
((IPublic)obj).GetString(); // 這邊因為ImplementIPublic 明確實作IPublic
// 所以其實obj 若沒有轉型,裡面是沒有實作的方法,因為只有明確實作
// 而明確實作必須轉型該明確實作的是誰,所以必須轉成IPublic 才會有
// GetString方法
IPublic IC = new ImplementIPublicProtectedY();
IC.GetString(); // 這邊會還傳Public 因為ImplementIPublicProtectedY有明確實作IPublic
Console.ReadLine(); // 的GetString
}
//*********************************************************************
// 以上範例是介紹 實作跟明確實作,該怎麼呼叫,若沒轉型則無法呼叫到明確實作的方法哦
//*********************************************************************
以上是擴充方法跟介面的基本介紹
物件導向課程心得Part6