聲明父類new子類

基本概念

這個實例是子類的,可是由於你聲明時是用父類聲明的,因此你用正常的辦法訪問不到子類本身的成員,只能訪問到從父類繼承來的成員。ide

在子類中用override重寫父類中用virtual申明的虛方法時,實例化父類調用該方法,執行時調用的是子類中重寫的方法;spa

若是子類中用new覆蓋父類中用virtual申明的虛方法時,實例化父類調用該方法,執行時調用的是父類中的虛方法;blog

 /// <summary>  
 /// 父類  
 /// </summary>  
 public class ParentClass  
 {  
     public virtual void ParVirMethod()  
     {  
         Console.WriteLine("父類的方法...");  
     }  
 }  

 /// <summary>  
 /// 子類1  
 /// </summary>  
 public class ChildClass1 : ParentClass  
 {  
     public override void ParVirMethod()  
     {  
         Console.WriteLine("子類1的方法...");  
     }  
 }  

 /// <summary>  
 /// 子類2  
 /// </summary>  
 public class ChildClass2 : ParentClass  
 {  
     public new void ParVirMethod()  
     {  
         Console.WriteLine("子類2的方法...");  
     }  

     public void Test()  
     {  
         Console.WriteLine("子類2的其餘方法...");  
     }  
 }

ParentClass par = new ChildClass1(); par.ParVirMethod(); //結果:「子類1的方法」,調用子類的方法,實現了多態
par = new ChildClass2(); par.ParVirMethod();//結果:「父類的方法」,調用父類的方法,沒有實現多態

  深究其緣由,爲什麼二者不一樣,是由於原理不一樣: 
override是重寫,即將基類的方法在派生類裏直接抹去從新寫,故而調用的方法就是子類方法;繼承

而new只是將基類的方法在派生類裏隱藏起來,故而調用的仍舊是基類方法。it

相關文章
相關標籤/搜索