声明父类new子类

基本概念

这个实例是子类的,但是因为你声明时是用父类声明的,所以你用正常的办法访问不到子类自己的成员,只能访问到从父类继承来的成员。

在子类中用override重写父类中用virtual申明的虚方法时,实例化父类调用该方法,执行时调用的是子类中重写的方法;

如果子类中用new覆盖父类中用virtual申明的虚方法时,实例化父类调用该方法,执行时调用的是父类中的虚方法;

 /// <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只是将基类的方法在派生类里隐藏起来,故而调用的仍旧是基类方法。

转载于:https://www.cnblogs.com/DSC1991/p/9358955.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值