一、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.pswp.cn/diannao/93466.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93466.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93466.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCPIP之常用协议

一、TCPIP之网络支撑协议 1.ARP ARP是网络层协议,在同一广播域内,将IP地址解析成MAC地址. 1.1 无故ARP 请求型无故ARP 设备在网络中不管是自动获取ip地址还是手动配置ip地址,设备都会发送请求型无故ARP检查这个ip地址是否有重复的。 应…

网络之路24:VLAN基础实验

正文共:2345 字 18 图,预估阅读时间:3 分钟目录网络之路第一章:Windows系统中的网络0、序言1、Windows系统中的网络 1.1、桌面中的网卡 1.2、命令行中的网卡 1.3、路由表 1.4、家用路由器网络之路第二章:认识企业设备2…

基于Verilog的神经网络加速器设计

本设计实现了一个高效的神经网络加速器,专注于卷积神经网络(CNN)的核心计算功能。该设计具有以下创新点: 并行处理架构:同时处理多个卷积窗口,提高计算吞吐量 动态权重加载:支持运行时更新卷积核权重 流水线优化:卷积、激活、池化三级流水线设计 可配置参数:支持不同尺寸…

基于springboot的零食商城的设计与实现/零食销售系统的设计与实现

用户:注册,登录,商品信息,团购商品,公告资讯,后台管理,在线客服,购物车,个人中心管理员:登录,个人中心,用户管理,商品类型…

《剑指offer》-算法篇-位运算

题目二进制中“1”的个数代码实现二进制中“1”的个数题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:求“1”的个数等价于求n-1与n进行“与”运算后不等于0所需要的运算次数。注意:这里的整数可能…

项目上线中的跨域问题

本文将深入解析跨域问题的本质,并提供实用的解决方案。引言 跨域问题可以说是前端开发者的"老朋友"了,特别是在项目从开发环境迁移到生产环境时,这个问题更是频繁出现。许多开发者对跨域的理解停留在表面,导致在项目上线…

dubbo应用之3.0新特性(响应式编程)(2)

一、介绍 Dubbo 3.0 的响应式编程基于 Triple 协议和 Reactor/RxJava 实现,支持全链路异步非阻塞通信。它通过引入 Mono、Flux 等响应式类型,打通跨进程的数据流式传输,天然支持反压、限流等控制能力。相比传统基于 CompletableFuture 的异步方式,响应式编程更适用于高并发…

力扣-22.括号生成

题目链接 22.括号生成 class Solution {List<String> res new ArrayList<>();StringBuilder path new StringBuilder();void backtracking(int n, int left, int right) {if (left right 2 * n) {res.add(path.toString());return;}if (left < n) {path.a…

架构实战——互联网架构模板(“网络层”技术)

目录 一、负载均衡 1.1、DNS 1.1.1、DNS 负载均衡的优点 1.1.2、DNS 负载均衡的缺点 1.2、Nginx 、LVS 、F5 1.2.1、软件和硬件的区别 1.2.2、4 层和 7 层的区别 二、CDN 三、多机房 3.1、同城多机房 3.2、跨城多机房 3.3、跨国多机房 四、多中心 本文来源:极客时间vip课程笔记…

TCP/IP 网络编程面试题及解答

在Qt/C面试中&#xff0c;若涉及“熟悉TCP/IP网络编程”&#xff0c;面试官通常会结合TCP/IP协议基础、Qt网络编程框架&#xff08;如Qt Network模块&#xff09;、C网络编程实现以及实际场景问题来提问。以下是常见面试题及解答&#xff1a; 一、TCP/IP协议基础 1. TCP和UDP的…

unity开发中Hash、Queue、LinkedList简单介绍

在Unity游戏开发中&#xff0c;除了Dictionary和List外&#xff0c;以下三种数据结构能高效解决特定问题场景&#xff1a;1. HashSet<T>&#xff1a;闪电级存在性检查 核心特点&#xff1a;基于哈希表实现的高效集合&#xff0c;元素唯一且无视顺序 优势&#xff1a; O(1…

智慧园区:科技与生活的完美融合

在城市的喧嚣中&#xff0c;我们常常渴望一片宁静而充满活力的绿洲。如今&#xff0c;随着科技的飞速发展&#xff0c;智慧园区应运而生&#xff0c;它不仅满足了我们对美好生活的向往&#xff0c;更以其独特的魅力&#xff0c;成为现代城市中一道亮丽的风景线。今天&#xff0…

继续打卡day6

383. 赎金信 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool canConstruct(string ransomNote, string magazine) {unordered_map<char, int> us;for(auto c: ransomNote){us[c]; // 将字符串存储}for(auto c: magazine){if(us.count(c)){us[c]-…

LIMA:大语言模型对齐的“少即是多”革命——原理、实验与范式重构

“千样本激活千亿参数&#xff1a;重新定义大模型对齐的本质” LIMA&#xff08;Less Is More for Alignment&#xff09; 是由 Meta AI 联合 卡内基梅隆大学 等机构于 2023年 提出的突破性大模型对齐框架&#xff0c;其核心颠覆了传统对齐需海量数据的认知&#xff0c;证明仅用…

vite.config.js常用配置

vite.config.js常用配置 import { defineConfig } from vite import { resolve } from "path"; import vue from vitejs/plugin-vueexport default defineConfig({plugins: [vue(), ], // 配置需要使用的插件列表base: ./, // 在生产中服务时的基本公共路径publicD…

JVM知识点(2)

目录 Java中可作为GC Roots的引用有哪几种&#xff1f; finalize方法 垃圾回收算法 标记-清除 标记-复制 标记-整理 分代收集算法 为什么要用分代收集 标记复制的标记过程和复制会不会停顿 MinorGC&#xff0c;MajorGC&#xff0c;MixedGC&#xff0c;FullGC FullGC…

Java HashMap中的compute及相关方法详解:从基础到Kafka Stream应用

HashMap是Java集合框架中最常用的数据结构之一&#xff0c;它提供了高效的键值对存储和检索功能。在Java8中&#xff0c;HashMap引入了一系列新的原子性更新方法&#xff0c;包括compute()、computeIfAbsent()和computeIfPresent()等&#xff0c;这些方法极大地简化了在Map中进…

【php中ssti模板注入讲解】

php中场景模板 1. Smarty 使用安全模式来执行不信任的模板,只运行PHP白名单里的函数。 2. Twig 与Smarty类似,不过无法利用该模板的SSTI调用静函数。 php常见模板入门 Smarty 不使用预先准备好的模板 使用预先准备好的模板 对值进行拼接后使用模板展示 设置在模板中…

Redis学习07-Redis的过期策略

Redis 过期策略 什么是过期策略 Redis 的过期策略用于管理设置了过期时间&#xff08;TTL&#xff09;的键&#xff0c;确保在键过期后能够被及时删除&#xff0c;从而释放内存 整体策略 Redis 采用的是定期删除惰性删除的组合策略 1. 定期删除 原理&#xff1a;周期性的从过期…

深入解读c++(命名空间)

目录 1关于命名空间 1.1是什么 1.2解决了什么问题 2.命名空间的定义 2.2命名空间的嵌套定义 3命名空间的特点 3.1命名空间不会影响生命周期 3.2命名空间只能在全局域里定义&#xff0c;当然嵌套定义时例外。 3.3在不同文件中定义相同名称的命名空间 4.命名空间的使用 …