[C#] interface & abstract 程式紀錄

今天與前輩有了一段很有趣對話,算是我向對方請教了,抽象化的寫法。

一直以來我都只看過教科書上寫過,或是各大神的文章,簡單說當初的我要看我也看不太懂。

不知道為什麼對於說抽象、實作介面...看了就像是天文書。

但今天和前輩請教了,之前前輩寫了一段Api 的IRequest 簡單工廠。

其實之前我一直都不知道到底怎麼實用這些抽象化的東西。

今天總算是有消化進去了。

再搭配這篇文章

(原創) interface和abstract class有何不同? (C/C++) (.NET) (C#)

引用裡面的一段文字

interface用在當一個物件須和其他物件共同合作時,為了確保其他物件有我想要的method,所以定下interface要該物件遵守,在Design Pattern到處可以看到這種應用,如strategy,bridge,prototype...。

而abstract class是用在整個繼承體系的最上層,用來定義出整個繼承體系該有哪些method,子類別可以對這些method加以override,或維持和abstract class相同的功能。Design Pattern中的template method,factory method...等就是用這種手法。

簡單說是 interface 裡面不會定"方法內容",只會定有甚麼方法的名稱,如果繼承了這個interface就"一定"要有裡面的方法。

而abstract 則是裡面有甚麼方法不一定要被實作,但如果接了abstract的方法繼承後一定要override,而也可以選擇用virtual方法,virtual方法就可以覆寫也可以不覆寫甚至還可以直接用父類別virtual方法內的內容。

這邊我自己寫了一點Code,做好紀錄。

    abstract class abstractClass
    {
        //一般方法 
        public void normalMethod() { }
        //abstract方法 不能有主體內容
        public abstract void testAbstractMethod() ;
        //virtaul方法 一定有主體內容
        public virtual void testVirtualMethod()
        {
            Console.WriteLine("Because Virtual must has value");
        }
    }

在繼承abstract 類別的時候

    class testAbstractClass : abstractClass
    {        
        //繼承後 abstract vs virtaul
        //1. Abstract 必須要有 override 才可以
        public override void testAbstractMethod() {
            Console.WriteLine("here is testAbstractMethod");
        }
        //2. Virtual 就不一定要覆寫 如果不要覆寫也完全沒關係
        //   但如果要叫用 testVirtualMethod的方法就一定要override
        //   內容放上base.testVirtualMethod()就可以

        //3. 但如果要覆寫 也還是可以
        public override void testVirtualMethod()
        {
            //這個base 是可以執行 abstractClass virtual 的內容
            base.testVirtualMethod();
            Console.WriteLine("here is testAbstractClass Override Virtual");
        }
    }

驗證結果:

        static void Main(string[] args)
        {
            testAbstractClass temp = new testAbstractClass();
            temp.testAbstractMethod();
            temp.testVirtualMethod();
            Console.ReadLine();
        }

那至於interface 就更單純了

    interface IClass
    {
        //interface 只需定義好 prop 和 方法名稱
        string myWord { get; set; }        
        void interfaceMakeWord();
    }

繼承時

    class testInterface : IClass
    {
        // interface method and prop 都一定要被實作
        public string myWord { get; set; }
        public void interfaceMakeWord()
        {
            myWord = "interfaceMakeWord should be defined here";
            Console.WriteLine(myWord);
        }
    }

驗證結果

        static void Main(string[] args)
        {
            testInterface testInterface = new testInterface();
            testInterface.interfaceMakeWord();        
            Console.ReadLine();
        }

這簡單的練習就幫助我,釐清interface & abstract & virtual 的用法

以後只要某些地方是需要一直重複的程式,其實就可以想一下是否可以使用interface & abstract 的Class