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修飾符,就可以一個物件扮演雙重角色,這也是一種強
大地多型吧。此段純屬個人感悟,因為剛學,大家多多指教。