重写override
子类中重新定义父类中已有的方法
重写语法
需要在要重写的父类方法添加一个virtual修饰符(虚方法)
在子类中的同名方法添加一个override修饰符
子类中添加新的成员,是继承中对父类的横向扩展
重写不添加新成员,而是增加已有成员的新版本,可以看着对父类的纵向扩展
但使用不同类型的实例调用该方法时,对应的方法版本就会被调用
(活字印刷的实现,一个坑里可以放同规格的不同铅字)
重写的条件
要重新的对象必须对子类可见(public或者protected)
方法签名需要一致(方法的参数列表、返回值、方法名)
多态
基于上一节提到的 父类变量可以装子类实例
但调用装着子类实例的变量时,运行的是子类中的方法逻辑
对重写方法,实际执行的方法逻辑是根据实例的类型
隐藏与重写的区别
若不写virtual和override,则称为 子类对父类成员隐藏
隐藏父类方法的子类中,还是有两个版本的该方法
而重写父类方法的子类中,只有一个版本该方法,那就是重写后的方法
实际工程中几乎不使用隐藏
JAVA中是天然重写,不需要加override和virtual
而在C#中这样写,并不能触发重写,会变成隐藏
方法调用时是顺着变量类型继承链向下找,到实例的类型结束
会找到最新(继承链上在下方的)被重新的方法版本
属性重写
属性的实现是通过get、set方法对字段封装,所以属性也可以使用重写
语法是在父类属性名前加virtual,子类重新属性名前加override
可以修改其中的逻辑
python中的重写
python中变量没有类型,实例对象有类型
所以不能用父类变量装子类实例然后调用重写后的方法,没有多态的效果
分类:
刘铁猛C#教程学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义