2014年1月26日 星期日

C# - new和override的使用

對於初學者來說Override和New的使用時機,常常會讓初學者搞不清楚,對於這二個特性極為相似的關鍵字,下面是微軟的描述:

在 C# 中,衍生類別可以包含擁有與基底類別方法相同之名稱的方法。
基底類別方法必須定義為 virtual。
如果衍生類別中的方法前面沒有加上 new 或 override 關鍵字,編譯器會發出警告,且方法的行為會如同有 new 關鍵字一般。
如果衍生類別中的方法前面加上 new 關鍵字,該方法會定義為與基底類別中的方法無關。
如果衍生類別中的方法前面加上 override 關鍵字,則衍生類別的物件會呼叫該方法,而不是基底類別方法。
衍生類別可使用 base 關鍵字呼叫基底類別方法。
override 、virtual 和 new 關鍵字也可用於屬性、索引子和事件。

override
簡單的說,就是Class2繼承Class1,也就是說父類別為Class1,子類別為Class2,換言之Class1為基底類別,Class2為衍生類別,而有時因為繼承的物件( Class2 )的方法( Test )會和父類別( Class1 )的方法 ( Test )有不一樣的處理邏輯,子類別的方法名稱可能會和父類別的方法名稱相同,但其實裡面的邏輯不同,而這個時候,就可以在父類別的方法裡面加上Virtual,子類別裡面的方法加上override,來進行方法邏輯複寫的動作,如下程式碼。

namespace ConsoleApplication1
{
    public class Class1
    {
        public virtual void Test()
        {
            Console.WriteLine("Class1.Test()");
        }
    }

    public class Class2 : Class1
    {
        public override void Test()
        {
            Console.WriteLine("Class2.Test()");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Class2 c = new Class2();
            c.Test();
        }
    }
}


上面的程式碼執行結果會是Class2.Test裡的的法方。

new
對於Overrride的不同,new在運作上有點不同,它必須要仰賴Virtual,。


namespace ConsoleApplication1
{
    public class Class1
    {
        //故意沒加上Virtual
        public void Test()
        {
            Console.WriteLine("Class1.Test()");
        }
    }

    public class Class2 : Class1
    {
        //這裡也不使用override關鍵字來複寫
        public void Test()
        {
            Console.WriteLine("Class2.Test()");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Class2 c = new Class2();
            c.Test();//

        }
    }
}

上面的程式結果,結果還是會出現Class2.Test()
就算不加上new和override還是可以正常編譯,但系統會出現警告提示,雖然說在這方面沒有什麼太大的不同,但是還是最好依循著正確的方式撰寫程式。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言