1. 程式人生 > >C#中overide與new的區別

C#中overide與new的區別

前段時間都在學java, 現在突然學C#,內容雖然大致相同,但是還有很多地方很不一樣,比如說方法的重寫:

overide : 表示“覆蓋”,顧名思義即把父類中的方法覆蓋掉,子類在類體外永遠都無法訪問到父類中被覆蓋的方法,即使被轉換成基型別,overide與java中含義上無甚區別;

new : 表示“隱藏”,內在含義是子類新擴充套件一個同樣的函式,暫時把基類的函式隱藏起來,當子類物件轉換成基類物件時,基類方法會再次暴露,而此時由於型別轉換子類方法丟失。

在java中並不存在類似new這樣的修飾符,也並沒有實現這樣的機制,個人感覺還是java簡潔,當然C#提供了更加精細的控制。

在講overide和new之前,先講一下virtual修飾符,在C#中所有的需要被覆蓋的方法都必須用virtual修飾,當然本來是overide修飾的方法如果還需要被覆蓋的話就無

需再用virtual修飾,所以又virtual new 但沒有virtual overide這樣的複合修飾。在Java中所有的方法預設都加上了virtual修飾。

先貼上一段簡單的程式碼:

public class ConsoleManager
    {
        class BaseClass
        {
            public virtual void f1()
            {
                Console.WriteLine("base fun 1");
            }

            public virtual void f2()
            {
                Console.WriteLine("base fun 2");
            }
        }

        class SubClass : BaseClass
        {
            public override void f1()
            {
                Console.WriteLine("sub fun 1");
            }

            public virtual new void f2()
            {
                Console.WriteLine("sub fun 2");
            }
        }

        static void Main(string[] args)
        {
            BaseClass localObj = new SubClass();

            localObj.f1();
            localObj.f2();
        }
    }

下面是執行結果截圖:

結果分析:

在SubClass中f1是覆蓋BaseClass中的f1方法,所以當localObj被轉換成BaseClass型別時,實際上BaseClass中f1被overide了,即被SubClass中的方法覆蓋了,

所以此時還是呼叫子類中的方法,當然如果用new修飾的話,轉換成基類後,基類的方法被暴露,而子類的方法丟失,所以此時呼叫的是基類的方法。overide就不多

講了,簡潔易懂。在一個物件無論他如果掩飾,它始終是哪個型別,任何東西都無法改變,而在C#中有了new修飾符,就可以一個物件扮演雙重角色,這也是一種強

大地多型吧。此段純屬個人感悟,因為剛學,大家多多指教。