• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jk-2048
博客园    首页    新随笔    联系   管理    订阅  订阅
刘铁猛C#学习笔记18 重写与多态

重写override

子类中重新定义父类中已有的方法

重写语法

需要在要重写的父类方法添加一个virtual修饰符(虚方法)
在子类中的同名方法添加一个override修饰符
 
子类中添加新的成员,是继承中对父类的横向扩展
重写不添加新成员,而是增加已有成员的新版本,可以看着对父类的纵向扩展
但使用不同类型的实例调用该方法时,对应的方法版本就会被调用
(活字印刷的实现,一个坑里可以放同规格的不同铅字)
 

重写的条件

要重新的对象必须对子类可见(public或者protected)
方法签名需要一致(方法的参数列表、返回值、方法名)
 

多态

基于上一节提到的 父类变量可以装子类实例
但调用装着子类实例的变量时,运行的是子类中的方法逻辑
对重写方法,实际执行的方法逻辑是根据实例的类型
 

隐藏与重写的区别

若不写virtual和override,则称为 子类对父类成员隐藏
隐藏父类方法的子类中,还是有两个版本的该方法
而重写父类方法的子类中,只有一个版本该方法,那就是重写后的方法
实际工程中几乎不使用隐藏
JAVA中是天然重写,不需要加override和virtual
而在C#中这样写,并不能触发重写,会变成隐藏
方法调用时是顺着变量类型继承链向下找,到实例的类型结束
会找到最新(继承链上在下方的)被重新的方法版本
 

属性重写

属性的实现是通过get、set方法对字段封装,所以属性也可以使用重写
语法是在父类属性名前加virtual,子类重新属性名前加override
可以修改其中的逻辑
 

python中的重写

python中变量没有类型,实例对象有类型
所以不能用父类变量装子类实例然后调用重写后的方法,没有多态的效果
 
posted on 2024-02-23 23:24  JK降谷羽  阅读(48)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3