20250529-C#知识:继承、密封类、密封方法、重写
C#知识:继承、密封类、密封方法、重写
继承是面向对象的三大特性之一,通过继承能够减少重复代码的编写,有助于提升开发效率。
1、继承
- C#不同于C++,只支持单继承
- 当子类出现与父类同名的成员时,父类成员被隐藏(不同于重写)
- 子类继承父类所有成员(包括私有成员)
- 个人猜想:子类对象(this表示)中包含了父类对象(base表示)
- 成员隐藏不会改变子类中父类对象的成员(new关键字不加隐藏也生效)
- 成员重写会改变子类中父类对象的成员
2、里氏替换原则原则
- 父类变量容器装载子类对象
3、is和as
- is用来判断对象是否是指定类或其子类的对象,返回一个bool
- as用来将对象强转成指定类的对象,成功返回指定类对象,失败返回null
Animal animal2 = frog;animal2.Run(); //动物跑if (animal2 is Frog) //青蛙跑(animal2 as Frog).Run();
4、继承中的构造函数
- 每个类默认有一个无参构造
- 用户自己定义了有参构造后,默认的那个无参构造会消失
- 所以一般用户定义有参构造后,还要定义无参构造
- 可以通过this关键字调用其他重载的构造
- 执行构造函数时,先执行爷爷类构造,再父类构造,最后子类构造
- 子类可以通过base关键字来调用父类构造
- 子类如果没显示调用父类的构造,则会默认调用父类的无参构造
5、运行时多态与方法重写
- 父类变量(容器)调用指定方法,实际调用的是它指向的子类对象实现的方法
- 重写之Vob:virtual、override、base
- virtual成员不能是private的
- 标记为override的成员不能被标记为new或virtual
- virtual只要出现一次,其子类后代都可以override
- override可以重写virtual、abstract、override方法
6、密封类
- 使用seal关键字修饰的类
- 无法被继承
7、密封方法
- seal一般与override一起出现
- 保护方法不被重写
- 子类可以用new隐藏父类的密封密封方法
8、完整代码示例:
namespace LearnExtend
{class Creature{public float weight;private float volumn; //父类私有变量子类无法直接访问public Creature() => Console.WriteLine("生物的无参构造");public Creature(float weight, float volumn){this.weight = weight;this.volumn = volumn;Console.WriteLine("生物的有参构造");}public void Run() => Console.WriteLine("生物跑");public virtual void SelfIntroduce() => Console.WriteLine("我是生物");public virtual void func() => Console.WriteLine("生物密封函数");}class Animal : Creature{public float speed;public Animal() => Console.WriteLine("动物的无参构造");public Animal(float weight, float volumn, float speed):base(weight, volumn){this.speed = speed;Console.WriteLine("动物的有参构造");}public new void Run() => Console.WriteLine("动物跑"); 隐藏父类的方法public override void SelfIntroduce() //重写父类方法{//base.SelfIntroduce();Console.WriteLine("我是动物");}public sealed override void func() => Console.WriteLine("动物密封函数");}class Frog:Animal{public string color;public new float speed; //隐藏父类成员变量public Frog(){this.color = "绿色";Console.WriteLine("青蛙的无参构造");}public Frog(float weight, float volumn, float speed, string color):base(weight, volumn, speed){this.color = color;Console.WriteLine("青蛙的有参构造");}public new void Run() => Console.WriteLine("青蛙跑"); //隐藏父类的方法public override void SelfIntroduce() //重写父类方法{Console.WriteLine("波浪浪");}public new void func() => Console.WriteLine("青蛙密封函数");}internal class Program{//里氏替换原则原则//父类变量容器装载子类对象static void SomeoneSpeak(Creature someone){someone.SelfIntroduce(); //重写 体现了运行时多态someone.Run(); //隐藏 没有体现多态}static void Main(string[] args){//里氏替换原则原则//父类变量容器装载子类对象Frog frog = new Frog(); //生物的无参构造 动物的无参构造 青蛙的无参构造Animal animal = new Animal(1, 2, 3); //生物的有参构造 动物的有参构造SomeoneSpeak(frog); //波浪浪 生物跑SomeoneSpeak(animal); //我是动物 生物跑Animal animal2 = frog;animal2.Run(); //动物跑if (animal2 is Frog) //青蛙跑(animal2 as Frog).Run();}}
}
9、参考资料:
- 《唐老狮C#》
本篇结束,感谢您的阅读~
相关文章:

20250529-C#知识:继承、密封类、密封方法、重写
C#知识:继承、密封类、密封方法、重写 继承是面向对象的三大特性之一,通过继承能够减少重复代码的编写,有助于提升开发效率。 1、继承 C#不同于C,只支持单继承当子类出现与父类同名的成员时,父类成员被隐藏࿰…...

从0到1,带你走进Flink的世界
目录 一、Flink 是什么? 二、Flink 能做什么? 三、Flink 架构全景概览 3.1 分层架构剖析 3.2 核心组件解析 四、Flink 的核心概念 4.1 数据流与数据集 4.2 转换操作 4.3 窗口 4.4 时间语义 4.5 状态与检查点 五、Flink 安装与快速上手 5.1 …...

springboot @value
#springboot value value 可以读取 yaml 中 的数据...

Dify-5:Web 前端架构
本文档提供了 Dify Web 前端架构的技术概述,包括核心组件、结构和关键技术。它解释了前端如何组织、组件如何通信以及国际化功能如何实现。 技术栈 Dify 的 Web 前端基于现代 JavaScript 技术栈构建: 框架:Next.js(基于 React …...

深度学习赋能图像识别:技术、应用与展望
论文: 一、引言 1.1 研究背景与意义 在当今数字化时代,图像作为信息的重要载体,广泛存在于各个领域。图像识别技术旨在让计算机理解和识别图像内容,将图像中的对象、场景、行为等信息转化为计算机能够处理的符号或数据 &am…...

八N皇后问题
1 问题的提出 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法 我们的任务就是用MATLAB进行求解 2 数学模型的构建 首先我们分析题目就是 任意两个皇后都不能处于…...

TMS320F28388D使用sysconfig配置IPC
第1章 配置IPC底层代码 使用IPC的动机: 我计划我的项目中要使用RS485,CANFD通信和EtherCAT通信,由于通信种类较多,而对于电机控制来说大部分数据都是重复的,并且有些数据可以很久才改变一次,所以我计划使…...
代码训练LeetCode(19)轮转数组
代码训练(19)LeetCode之轮转数组 Author: Once Day Date: 2025年6月3日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 189. 轮转数组 - 力扣(LeetCode)力扣 (LeetCode) 全球极客挚爱的…...
每日算法 -【Swift 算法】将整数转换为罗马数字
💡 Swift:将整数转换为罗马数字(含思路讲解与详细注释) 罗马数字是一种古老的数字表示方式,虽然在现代我们不再使用它进行计算,但在表盘、章节、纪念碑等地方依然很常见。今天我们就来实现一个经典算法题&…...

Qwen与Llama分词器核心差异解析
Qwen和 Llama 词映射(分词器)的区别及通用词映射逻辑 一、Qwen 与 Llama 词映射(分词器)区别 维度Qwen 分词器Llama 分词器技术基础基于字节级别字节对编码(BBPE),以 cl100k 为基础词库,扩充中文字词、多语言词汇基于 BPE,但依赖 SentencePiece 单字模型,核心为英文优…...

华为云Flexus+DeepSeek征文 | 基于ModelArts Studio 与 Cline 快速构建AI编程助手
目录 一、前言 二、ModelArts Studio(MaaS)介绍与应用场景 2.1ModelArts Studio(MaaS)介绍 2.2 ModelArts Studio(MaaS)使用场景 2.3 开通MaaS服务 2.4 开通DeepSeek-V3商用服务 三、Cline简介和安装 3.1 C…...

pikachu靶场通关笔记11 XSS关卡07-XSS之关键字过滤绕过(三种方法渗透)
目录 一、源码分析 1、进入靶场 2、代码审计 3、攻击思路 二、渗透实战 1、探测过滤信息 2、注入Payload1 3、注入Payload2 4、注入Payload3 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关)渗透集合,通过对XSS关卡源码的代码审计找到安…...
Android App引用vendor编写的jni动态库
简单描述一下,就是我自己基于FastDDS写了一个Jni的so,然后编写了jar包引用该so,最后写了一个Android的测试apk使用jar包,调用jni中的接口去创建Participant,Subscriber等。 实际将jni的so放到 /system_ext/lib64&#…...
React从基础入门到高级实战:React 核心技术 - 错误处理与错误边界:构建稳定的应用
React 错误处理与错误边界:构建稳定的应用 在开发 React 应用时,错误处理是确保应用稳定性和用户体验的重要环节。无论是运行时错误、API 请求失败还是用户操作失误,合理的错误处理机制都能防止应用崩溃,并为用户提供清晰友好的反…...
页面输入数据的表格字段(如 Web 表单或表格控件)与后台数据库进行交互时常用的两种方式
“从页面输入数据的表格字段(如 Web 表单或表格控件)在与后台数据库进行交互时,常用的有两种方式:” 🎯 两种方式(操作调用数据库、绑定数据) 🚀 方式1:前端代码提交数据到后端,再由后端调用数据库 💡 原理和逻辑: 用户在页面上(比如输入表单、表格)输入数据…...

碰一碰发视频-源码系统开发技术分享
#碰一碰营销系统# #碰一碰系统# #碰一碰发视频# 架构设计哲学:近场通信的优雅平衡 一、核心通信技术选型 1. 双模协同传输引擎 技术协议栈延迟控制适用场景NFCISO 14443-A<100ms精准触发场景BLE 5.0GATT Profile300-500ms中距传输场景 工程决策依据&…...

C++学习过程分享
空指针:int *p NULL; 空指针:指针变量指向内存中编号为0的空间;用途:初始化指针变量注意:空指针指向的内存不允许访问注意:内存编号为0-255为系统占用空间,不允许用户访问 野指针:…...

C语言 — 动态内存管理
目录 1.malloc和free函数1.1 malloc函数1.2 free函数1.3 malloc函数的使用 2.calloc函数2.1 calloc函数2.2 calloc函数的使用 3.realloc函数3.1 realloc函数3.2 realloc函数的使用 4.动态内存管理笔试题4.1 笔试题(1)4.2 笔试题(2)…...

《TCP/IP 详解 卷1:协议》第5章:Internet协议
IPv4和IPv6头部 IP是TCP/IP协议族中的核心协议。所有TCP、UDP、ICMP和IGMP 数据都通过IP数据报传输。IP提供了一种尽力而为、无连接的数据报交付服务。 IP头部字段 IPv4 头部通常为 20 字节(无选项时),而 IPv6 头部固定为 40 字节。IPv6 不…...
C#面向对象实践项目--贪吃蛇
目录 一、项目整体架构与核心逻辑 二、关键类的功能与关系 1. 游戏核心管理类:Game 2. 场景接口与基类 3. 具体场景类 4. 游戏元素类 5. 基础结构体与接口 三.类图 四、核心流程解析 五、项目可优化部分 一、项目整体架构与核心逻辑 该项目运用场景管理模…...

学习STC51单片机26(芯片为STC89C52RCRC)
每日一言 真正的强者,不是没有眼泪,而是含着泪依然奔跑。 硬件:4G模块 这个是接线原理,我们也只要知道这个4根线的连接就好了,我们也是连接到USB转TTL的模块上 要插卡哈......... 随后我们下载一个叫做亿佰特的调试助…...
Web前端为什么要打包?Webpack 和 Vite 如何助力现代开发?
一. 为什么要使用框架库? 1.1 传统网页与现代前端的差异 在最早期的网页开发中,我们只需要写几个.html文件,配上.css和.js文件,浏览器直接加载就能展现页面,每个文件都是独立的静态资源,简单且直观 但现在网站越来越复杂了: 需要用到最新的js语法(比如ES6)使用框架(Vue…...

Nginx详解(三):ngx_http_rewrite_module模块核心指令详解
概要: 在 Nginx 的众多功能模块中,ngx_http_rewrite_module是实现请求动态处理的核心组件,它通过一系列指令实现 URI 重写、条件判断、响应返回等功能。本文将以 CentOS 7.9 环境为例(主机名www.a.com,IP 172.25.0.10…...
C++ 建造者模式:简单易懂的设计模式解析
一、引言 在软件开发中,我们经常会遇到一些复杂对象的创建过程,这些对象通常由多个部分组成,并且每个部分的构建过程可能非常复杂。建造者模式(Builder Pattern)就是为了解决这类问题而诞生的一种创建型设计模式。本文将以简单易懂的方式介绍C++中的建造者模式,帮助你理…...

【笔记】在 MSYS2(MINGW64)中正确安装 Poetry 的指南
#工作记录 在 MSYS2(MINGW64)中正确安装 Poetry 的指南 一、背景说明 在 MSYS2(MINGW64)环境中,即使已经安装了 pip,也不建议直接使用 pip install poetry 来安装 Poetry。 这是因为 MSYS2 使用自己的包…...

IDEA项目推送到远程仓库
打开IDEA——>VCS——>Creat Git 选择项目 push提交到本地 创建远程仓库 复制地址 定义远程仓库 推送 推送成功...
DeepSeek 赋能 NFT:数字艺术创作与交易的革新密码
目录 一、NFT:数字世界的独特资产1.1 NFT 的定义与本质1.2 NFT 的价值支撑1.3 NFT 的丰富类型 二、DeepSeek:AI 领域的创新力量2.1 DeepSeek 的发展历程与成就2.2 DeepSeek 的核心技术与能力 三、DeepSeek 在 NFT 创作中的神奇应用3.1 高效生成数字艺术作…...

【后端架构师的发展路线】
后端架构师的发展路线是从基础开发到技术领导的系统性进阶过程,需融合技术深度、架构思维和业务洞察力。以下是基于行业实践的职业发展路径和关键能力模型: 一、职业发展阶梯 初级工程师(1-3年) 核心能力:掌…...

matlab/simulink TLC语法基础练习实例
一、基本语法测试方法 1.新建一个脚本,保存扩展名为tlc,本例中是tst.tlc,设置当前工作路径为保存的tlc文件路径,在tlc文件里面输入下面的代码,然后保存: %warning test 2.在MATLAB的命令窗口输入: tlc …...
MAU算法流程理解
参考文献:湘江船闸的过闸调度算法研究(李 楠,李桂华,尹剑平) (湖南湘江航运建设开发有限公司,湖南 长沙 410011) MAU算法流程 图4展示的是一种船舶排档算法(MAU算法),它…...