声明类型和实际类型,以及多态

对象的声明类型和实际类型

在阅读本文时,可以先认为接口的实现也是一种子类继承父类的机制。

对一个对象声明类型为父类,而赋值于子类型,比如father f=new son(),这种情况下,对该类型的GetType获得的值实际上是子类的类型。
简单的说就是,声明类型=父类,实际类型=子类


这时候,虽然他看上去像个子类型,可能你认为那么它就是子的类型了,既然是子类的类型,赋值给子类应该没问题,那么你就错了。当你去把f赋值给子类s的话:s=f会出错,因为它的声明类型仍然是父类,父类无法隐式的转换成子类。(因为父类的信息比子类少,转换的话,对于某些信息父类不能提供)
但是子类赋值给父类没问题,f=s,没问题(因为父类信息比子类少,子类的某些信息会在转换后丢失)。

其实这句话声明类型=父类,实际类型=子类正是多态的本质,明明是A但是表现的行为却像B。
这里有一点重要的问题
比如有一个方法func,在父类中有,也在子类中也有,那么运行对于 f.func,应该运行那个呢,之前说过,他明明是f但是表现的行为却像s,因此他应该是运行s的方法。是这样吗?

这里,C#提供了2种不同的方式,一种可以让f以son的方式运行,另一种让f以father,也就是他自己的方式运行。这里的奥妙在于子类继承父类方法的时候,采用override修饰符还是new修饰符。

先说明一点,在C#中,如果父类有方法public void func(),子类也有方法public void func(),虽然签名都一样,但是可以认为它们两个是没有关系的独立的方法。f.func()调father的方法,s.func()调用son的方法。但是如果父类有方法public virtual void func(),那么子类的同名方法就可以有3种写法:public void func(),public new void func(),public override void func().virtual表示虚方法,表示可以重写该,但是也可以不重写。
其中public void func()=public new void func()。
回到之前的问题,如果用override修饰,则表示重写了该父类的方法,也就是说f.func实际上运行的是s.func,明明是f类型,但是表现出s类型的行为。多态了。
如果用new修饰,则表示不重写该父类方法,该方法独立于父类。调用f.func,运行的就是f.func,没有显示出多态的行为。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值