重写override
子类中重新定义父类中已有的方法
重写语法
需要在要重写的父类方法添加一个virtual修饰符(虚方法)
在子类中的同名方法添加一个override修饰符
子类中添加新的成员,是继承中对父类的横向扩展
重写不添加新成员,而是增加已有成员的新版本,可以看着对父类的纵向扩展
但使用不同类型的实例调用该方法时,对应的方法版本就会被调用
(活字印刷的实现,一个坑里可以放同规格的不同铅字)
重写的条件
要重新的对象必须对子类可见(public或者protected)
方法签名需要一致(方法的参数列表、返回值、方法名)
多态
基于上一节提到的 父类变量可以装子类实例
但调用装着子类实例的变量时,运行的是子类中的方法逻辑
对重写方法,实际执行的方法逻辑是根据实例的类型
隐藏与重写的区别
若不写virtual和override,则称为 子类对父类成员隐藏
隐藏父类方法的子类中,还是有两个版本的该方法
而重写父类方法的子类中,只有一个版本该方法,那就是重写后的方法
实际工程中几乎不使用隐藏
JAVA中是天然重写,不需要加override和virtual
而在C#中这样写,并不能触发重写,会变成隐藏
方法调用时是顺着变量类型继承链向下找,到实例的类型结束
会找到最新(继承链上在下方的)被重新的方法版本
属性重写
属性的实现是通过get、set方法对字段封装,所以属性也可以使用重写
语法是在父类属性名前加virtual,子类重新属性名前加override
可以修改其中的逻辑
python中的重写
python中变量没有类型,实例对象有类型
所以不能用父类变量装子类实例然后调用重写后的方法,没有多态的效果
浙公网安备 33010602011771号