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

相关文章:

  • 屏幕适配--像素篇
  • C/C++---I/O性能优化
  • Linux的磁盘存储管理实操——(下二)——逻辑卷管理LVM的扩容、缩容
  • 小白如何认识并处理Java异常?
  • gig-gitignore工具实战开发(三):gig add基础实现
  • 双指针算法介绍及使用(下)
  • which soffice soffice not found
  • OpenRLHF:面向超大语言模型的高性能RLHF训练框架
  • 机器学习之knn算法保姆级教学
  • SEC_FirePower 第二天作业
  • Keepalived 原理及配置(高可用)
  • ubuntu22.04.4锁定内核应对海光服务器升级内核无法启动问题
  • 【Docker项目实战】在Docker环境下部署go-file文件分享工具
  • 5G基站信号加速器!AD8021ARZ-REEL7亚德诺 超低噪声高速电压放大器 专利失真消除技术!
  • 从零开发Java坦克大战:架构设计与难点突破 (下)
  • C++ 多线程同步机制详解:互斥锁、条件变量与原子操作
  • 电子电气架构 --- 车载软件与样件产品交付的方法
  • TDengine 转化函数 TO_TIMESTAMP 用户手册
  • Python 程序设计讲义(21):循环结构——while循环
  • Leetcode力扣解题记录--第21题(合并链表)
  • C++ 常用的数据结构(适配器容量:栈、队列、优先队列)
  • [NPUCTF2020]ReadlezPHP
  • 基于深度学习的图像分类:使用Vision Transformer(ViT)实现高效分类
  • 【RDMA】Adapters PRM Mellanox Adapters Programmer’s Reference mellanox网卡编程手册0.52
  • Lua(数据库访问)
  • 【开发杂谈】用AI玩AI聊天游戏:使用 Electron 和 Python 开发大模型语音聊天软件
  • Web攻防-业务逻辑篇密码找回重定向目标响应包检验流程跳过回显泄露验证枚举
  • 前端核心进阶:从原理到手写Promise、防抖节流与深拷贝
  • OneCode3.0 Gallery 组件前后端映射机制:从注解配置到前端渲染的完整链路
  • [NLP]UPF+RTL联合仿真的VCS命令及UPF-aware 波形工具的使用