物件導向課程心得Part5

OK本篇文章繼續講到第二天尾身課程內容
這次要來講所謂的擴充方法
相信有再寫LINQ的朋友們
對擴充方法吧應該都不陌生
常用的.Where( ) 就是擴充方法了
今天要來教大家怎麼撰寫擴充方法

擴充方法
1、擴充方法必須定義在靜態類別內
2、方法本身必須是靜態
3、方法的參數第一個必須加上關鍵字 this
4、題外話,靜態類別中只能有靜態成員,但非靜態類別也能有靜態成員
 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種,一種是實做介面,一種是明確實作介面  (兩個是不一樣的哦!!!很重要)
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