当前位置: 首页 > news >正文

【C#补全计划:类和对象(七)—— 重写虚方法】

一、virtual和override

1. 问题引入:使用里氏替换原则时,使用父类容器装载子类对象,若不使用virtual和override而是使用new,当子类调用两个类共有的方法时,调用的是父类的方法而不是子类的方法:

using System;namespace Polymorphism
{class Program{static void Main(string[] args){// 使用new关键字隐藏父类方法Father son = new Son();son.fun(); // 输出:调用父类fun()方法(son as Son).fun(); // 输出:调用子类fun()方法}}// 使用new关键字隐藏父类方法class Father{public void fun(){Console.WriteLine("调用父类fun()方法");}}class Son : Father{public new void fun() // 使用new关键字隐藏父类方法{Console.WriteLine("调用子类fun()方法");}}
}

运行结果如下:

2. virtual:使父类的方法变为虚方法,可以被子类重写

3. override:使子类的方法重写父类的方法

4. 使用:

using System;namespace Polymorphism
{class Program{static void Main(string[] args){// 使用new关键字隐藏父类方法 Father son = new Son();son.fun(); // 输出:调用父类fun()方法(son as Son).fun(); // 输出:调用子类fun()方法// 使用override关键字重写父类方法GameObject player = new Player();player.ATK(); // 输出:Player攻击(player as Player).ATK(); // 输出:Player攻击}}// 使用new关键字隐藏父类方法class Father{public void fun(){Console.WriteLine("调用父类fun()方法");}}class Son : Father{public new void fun() // 使用new关键字隐藏父类方法{Console.WriteLine("调用子类fun()方法");}}// 使用override关键字重写父类方法class GameObject{public virtual void ATK(){Console.WriteLine("Gameobject攻击");}}class Player : GameObject{public override void ATK() // 使用override关键字重写父类方法{Console.WriteLine("Player攻击");}}
}

运行结果如下:

二、保留父类行为

1. 关键字:base

2. 作用:调用父类的方法

3. 使用:

using System;namespace Polymorphism
{class Program{static void Main(string[] args){// 使用new关键字隐藏父类方法 Father son = new Son();son.fun(); // 输出:调用父类fun()方法(son as Son).fun(); // 输出:调用子类fun()方法// 使用override关键字重写父类方法GameObject player = new Player();player.ATK(); // 输出:Player攻击(player as Player).ATK(); // 输出:Player攻击// 使用多态调用父类方法GameObject enemy = new Enemy();enemy.ATK(); // 输出:Gameobject攻击}}// 使用new关键字隐藏父类方法class Father{public void fun(){Console.WriteLine("调用父类fun()方法");}}class Son : Father{public new void fun() // 使用new关键字隐藏父类方法{Console.WriteLine("调用子类fun()方法");}}// 使用override关键字重写父类方法class GameObject{public virtual void ATK(){Console.WriteLine("Gameobject攻击");}}class Player : GameObject{public override void ATK() // 使用override关键字重写父类方法{Console.WriteLine("Player攻击");}}class Enemy : GameObject{public override void ATK() // 使用override关键字重写父类方法{Console.Write("Enemy: ");base.ATK(); // 保留父类行为}}
}

运行效果如下:

        今天的学习就到这里了。感谢阅读。

        再见!

http://www.dtcms.com/a/297878.html

相关文章:

  • CMOS知识点 双阱工艺 三阱工艺
  • 大数据中心——解读60页IDC云数据中心机房运维服务解决方案【附全文阅读】
  • 【优选算法】链表
  • 2025.7.25 测试 总结
  • C/C++---I/O性能优化
  • ISAAC ROS 在Jetson Orin NX上的部署
  • 自动化UI测试工具TestComplete的AI双引擎:即时数据集 + 自愈测试
  • BGP负载均衡-9
  • C#观察者模式示例代码
  • Qt 拔网线等情况下收不到disconnected()信号
  • 数据结构之 【排序】(非递归实现快速排序)
  • 【Web安全】逻辑漏洞之URL跳转漏洞:原理、场景与防御
  • QEMU RISCV TCG 详解六 -- RISCV CPU 的使能(How a RISCV CPU Realized)
  • 算法:数组part02: 209. 长度最小的子数组 +
  • 视频孪生技术赋能仓储智慧化转型
  • Leetcode力扣解题记录--第21题(合并链表)
  • 已解决:Please check the setting of primary
  • 自定义控件
  • 逆向工程信息抽象层次详解
  • 指令改图,换背景/改文字/调光影等
  • Spring Boot2 静态资源、Rest映射、请求映射源码分析
  • SAP在未启用负库存的情况下,库存却出现了负数-补充S4 1709 BUG
  • Text Edit + ComboBox 属性(2)
  • SpringBoot(黑马)
  • Ansible自动化运维工具详解
  • n8n插件增加repeat_penalty参数适配Qwen3
  • HCIA再复习
  • 3款好用的服装外贸系统对比分析
  • 蜘蛛强引的原理与百度SEO的关系
  • 无人机视觉模块技术解析