当前位置: 首页 > 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.lryc.cn/news/599464.html

相关文章:

  • 重构 MVC:让经典架构完美适配复杂智能系统的后端业务逻辑层(内附框架示例代码)
  • 图片查重从设计到实现(4)图片向量化存储-Milvus 单机版部署
  • 【大模型实战】提示工程(Prompt Engineering)
  • 《基于电阻抗断层扫描(EIT)驱动的肌肉骨骼模型表征人体手臂动态意图用于人机交互》论文解读
  • SpringBoot实战指南:从快速入门到生产级部署(2025最新版)
  • Linux进程信号——信号保存
  • RWA项目面临的主要风险有哪些?例如市场风险、技术风险和法律风险。
  • 比特币技术简史 第九章:比特币的未来 - 发展趋势、挑战和机遇
  • Linux: network: wireshark: esp attempt to detec null-encrypted esp payloads
  • Linux: network: wireshark: tcp的segment重组是怎么判断出来的
  • Comfyui中Upscale Image By 几种放大方法的区别
  • Oracle转Mysql建表脚本
  • mysql 和oracle的选择
  • 【矩阵专题】Leetcode48.旋转图像(Hot100)
  • 【源力觉醒 创作者计划】ERNIE-4.5-VL-28B-A3B 模型详解:部署、测试与 Qwen3 深度对比测评
  • leetcode_122 买卖股票的最佳时机II
  • Axios基本使用
  • 分别使用 Java 8 和 Python 调用 Elasticsearch 接口简单获取数据
  • Web前端:JavaScript 随机点名系统案例详解
  • 常用设计模式系列(十二)—享元模式
  • OpenTelemetry学习笔记(十二):在APM系统中,属性的命名空间处理遵循规则
  • 基于讯飞星火AI的文学作品赏析系统开发实战:从通用聊天到专业文学分析的完整技术方案
  • 新房装修是中央空调还是壁挂空调好?
  • 滑动窗口---6(稍难)
  • GDB调试命令学习
  • 【开源软件】SimpleAI一款轻量级的桌面随身AI助手
  • 航段导航计算机 (Segment_Navigator) 设计与实现
  • OSPF 协议(多区域)
  • Python智能优化算法实战指南
  • 汪小菲食通达公司成立新零售公司,布局餐饮零售新赛道