一句話說明白C#中的new與override的區別:
父類引用指向子類物件時呼叫方法,如果用是override重寫,執行的是子類的方法;如果用的是new覆蓋,執行的是父類的方法。
如果看了上面那句話,你還不是很懂,請看下面炒雞清晰的程式碼,就肯定能明白啦!
public class BaseClass {
public virtual void PrintSomething(){
Console.WriteLine("執行了 父類 方法!");
}
}
public class DerivedClass : BaseClass {
public override void PrintSomething(){
Console.WriteLine("執行了 子類 方法!");
}
}
//客戶端
public static void Main(string[] args){
BaseClass instance = new DerivedClass(); //父類引用指向子類物件
instance.PrintSomeThing();
}
//輸出:
執行了 子類 方法!
如果換成new的話,請看下面:
public class BaseClass {
public virtual void PrintSomething(){
Console.WriteLine("執行了 父類 方法!");
}
}
public class DerivedClass : BaseClass {
public new void PrintSomething(){
Console.WriteLine("執行了 子類 方法!");
}
}
//客戶端
public static void Main(string[] args){
BaseClass instance = new DerivedClass(); //父類引用指向子類物件
instance.PrintSomeThing();
}
//輸出:
執行了 父類 方法!
現在明白了吧!
如果是父類引用指向父類物件,當然是執行父類方法;同樣滴,子類引用指向子類物件,當然執行子類方法;
如果是父類引用指向子類物件呢?就是上面講的:子類用override重寫,該引用會向上傳遞到,執行子類方法;而如果是用new覆蓋的話,相當於是對父類隱藏了此方法,故而執行父類方法;