C# 中的多态和虚方法,如何实现多态和使用虚方法?
在 C# 中,多态(Polymorphism)是面向对象编程的基本特性之一,它允许使用不同的对象和方法来执行同一操作。C# 中实现多态的方式主要是通过虚方法和抽象类。
虚方法是一种允许子类覆盖的方法,它的实现是在运行时动态确定的。C# 中,可以通过在方法前面加上 virtual 关键字来定义一个虚方法。子类可以使用 override 关键字来覆盖基类的虚方法,从而实现多态。下面是一个简单的例子:
public class Animal
{public virtual void MakeSound(){Console.WriteLine("The animal makes a sound.");}
}public class Dog : Animal
{public override void MakeSound(){Console.WriteLine("The dog barks.");}
}public class Cat : Animal
{public override void MakeSound(){Console.WriteLine("The cat meows.");}
}class Program
{static void Main(string[] args){Animal animal = new Animal();Animal dog = new Dog();Animal cat = new Cat();animal.MakeSound();dog.MakeSound();cat.MakeSound();}
}
输出结果为:
The animal makes a sound.
The dog barks.
The cat meows.
在这个例子中,Animal 类定义了一个虚方法 MakeSound(),而 Dog 和 Cat 类则分别覆盖了该方法。在 Main 函数中,我们创建了一个 Animal 对象和两个子类对象,并分别调用了它们的 MakeSound() 方法。由于 Dog 和 Cat 类覆盖了 MakeSound() 方法,所以它们的输出结果与基类的不同。
除了虚方法,抽象类也是实现多态的一种方式。抽象类是一种不能被实例化的类,它只能被用作其他类的基类。C# 中,可以通过在方法前面加上 abstract 关键字来定义一个抽象方法。子类必须实现抽象方法,否则子类也必须定义为抽象类。下面是一个简单的例子:
public abstract class Shape
{public abstract double GetArea();
}public class Square : Shape
{private double side;public Square(double s){side = s;}public override double GetArea(){return side * side;}
}public class Circle : Shape
{private double radius;public Circle(double r){radius = r;}public override double GetArea(){return Math.PI * radius * radius;}
}class Program
{static void Main(string[] args){Shape[] shapes = new Shape[2];shapes[0] = new Square(5);shapes[1] = new Circle(3);foreach (Shape shape in shapes){Console.WriteLine("Area of {0}: {1}", shape.GetType().Name, shape.GetArea());}}
}
输出结果为:
Area of Square: 25
Area of Circle: 28.274333882308
当基类中声明的方法被子类重写时,子类的方法将被调用。这种方法调用的行为称为虚方法调用。虚方法调用通过运行时检查确定要调用的方法,这就是多态。
要实现多态和虚方法,需要遵循以下步骤:
- 在基类中声明虚方法:在基类中声明一个方法,并使用
virtual关键字表示该方法是可重写的。例如:public class Animal {public virtual void MakeSound() {Console.WriteLine("The animal makes a sound");} } - 在子类中重写虚方法:在子类中使用
override关键字重写基类中声明的虚方法。例如:public class Dog : Animal {public override void MakeSound() {Console.WriteLine("The dog barks");} } - 创建对象并调用方法:创建一个子类的对象,并调用重写的虚方法。例如:
Animal animal = new Dog(); animal.MakeSound(); // 输出 "The dog barks"在这个例子中,我们创建了一个
Dog类的对象,并将其赋值给了一个Animal类型的变量。然后调用MakeSound()方法,输出 "The dog barks"。因为MakeSound()方法被声明为虚方法并且在子类中重写了,所以在运行时会调用子类中的方法,而不是基类中的方法。这就是在 C# 中实现多态和使用虚方法的基本方法。
相关文章:
C# 中的多态和虚方法,如何实现多态和使用虚方法?
在 C# 中,多态(Polymorphism)是面向对象编程的基本特性之一,它允许使用不同的对象和方法来执行同一操作。C# 中实现多态的方式主要是通过虚方法和抽象类。 虚方法是一种允许子类覆盖的方法,它的实现是在运行时动态确定…...
R软件使用一些常见的问题
以下均是个人经验摸索的解决办法,使用 Rstudio 执行命令,如有高手能更好地解决问题,还望指教,提前感谢。 问题一: 有些 package 因为编辑得比较早又没有继续更新,所以需要用旧版本的 R 才能正常运行&#…...
为什么需要uboot?
一、先看概念 bootROM:一种固化在芯片内部的只读存储器(ROM),用于启动和初始化系统。BootROM 中通常包含了一些预先编写好的代码,用于完成系统启动前的基本初始化和配置,例如初始化时钟、GPIO控制器、中断…...
Qt布局实战:实现高效、美观的GUI应用程序
Qt布局实战:实现高效、美观的GUI应用程序 引言 (Introduction)1.1 Qt布局简介 (Brief introduction to Qt layouts)1.2 Qt布局的优势 (Advantages of Qt layouts) 2.布局类型 (Layout Types)2.1 水平布局 (QHBoxLayout)2.1.1 创建水平布局2.1.2 向水平布局中添加部件…...
推荐几款项目管理工具,提高你的团队协作效率
如何管理团队才能使团队发挥最大的价值,如果团队缺少协作,就会因为团队的内耗和冲突导致项目无法完成,如何提高团队协作效率呢?我们可以借助团队协作类的项目管理工具。 几个常见的项目管理工具: 1、进度猫 进度猫是…...
SQL101 检索每个顾客的名称和所有的订单号(一)
描述 Customers表代表顾客信息含有顾客id cust_id和 顾客名称 cust_name cust_idcust_namecust10andycust1bencust2tonycust22tomcust221ancust2217hex Orders表代表订单信息含有订单号order_num和顾客id cust_id order_numcust_ida1cust10a2cust1a3cust2a4cust22a5cust221…...
mac压缩文件多了__MACOSX目录问题
文章目录 背景原因解决方案:更换压缩方式分析问题拓展(.DS_Store) 背景 项目中有一个场景,需要把目录压缩为app离线包的zip 但是压缩之后一致打不开,别人上传的zip是好的 原因 如图,我上传的在安卓设备…...
1.17 从0开始学习Unity游戏开发--场景切换
前面的所有文章我们都在一个固定的游戏场景内进行开发,在最开始介绍场景这个概念的时候就已经提及,这个场景可以是一张地图,或者是一个对战房间等等,所以显然这个场景可以有多个,并且可以从一个场景切换到另外一个场景…...
【golang学习笔记】——(五)Go格式化统一代码风格
我们在入职一家新公司的时候,除了要学习公司的流程规范和规章制度,还会做的一件事情就是进行公司编码规范的学习,基于google的C规范下,做了各自的发散和规范,久而久之就是包罗万象的样子,疲于应付各种规范约…...
CAD转SHP最好的方法 赶快收藏起来吧
1、利用 ArcToolsbox 工具先将 DWG 文件转为 MDB 通过 CASS 软件生成的 DWG 文件,字段中包含有很多属性内容,所以我们先将 DWG 格式 的文件转换为 MDB 格式,再通过 MDB 转换为 SHP 格式数据进行整理。具体步骤如下: 通过 ArcTool…...
PyQt PyQt5 Python VTK Gui Actor 选中 高亮显示 actor
前言: 本文主要介绍了如何使用Python VTK高亮显示actor,使用Python语言,高亮显示选中的actor。当窗口中的圆球actor被选中时,会变成红色,并且会显示actor三遍面片边缘信息。 效果: VTK VTK,&…...
TCP和UDP通信对比
tcp通信流程 服务器: 创建流式套接字 绑定 监听 提取 读写 关闭 客户端: 创建流式套接字 连接 读写 关闭 收发数据: read recv ssize_t recv(int sockfd, void *buf, size_t len, int flags); //flagsMSG_PEEK 读数据不会删除缓冲区的数据 write send ssize_t send(int…...
SpringCloud:ElasticSearch之自动补全
当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,如图: 这种根据用户输入的字母,提示完整词条的功能,就是自动补全了。 因为需要根据拼音字母来推断,因此要用到拼音分词功能。 1.拼音分词器…...
TOOM解析如何搭建一套适合自己的舆情监测系统?完整的实战指南
随着互联网的普及和社交媒体的盛行,人们在网络上的活动越来越多,同时也涌现出大量的信息和舆情。这些信息和舆情在一定程度上会影响社会和个人的发展和进步。因此,舆情监测逐渐成为一项重要的任务。在本篇文章中,我们将为大家介绍…...
技术分享 | OceanBase 手滑误删了数据文件怎么办
作者:张乾 外星人2号,现兼任六位喵星人的资深铲屎官。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 手滑误删了数据文件,并且没有可替换的节点时&…...
windows上Git Bash支持常用命令gcc tree zip wget cmake ninja
windows上Git Bash支持常用命令gcc tree zip wget cmake ninja 前言 Git Bash基于MinGW64, 提供了win32下的linux命令环境,如ls、cat、tar等。 但是Git Bash还是缺少一些命令,如gcc、make、tree、zip、wget、cmake、ninja等 1. Git Bash支持其他命令…...
面试题30天打卡-day10
1、String 和 StringBuffer、StringBuilder 的区别是什么? String、StringBuffer、StringBuilder主要的区别在于执行效率和线程安全上。 String:String字符串常量,意味着它是不可变的,导致每次对String都会生成新的String对象&a…...
【python】制作一个简单的界面,有手就行的界面~
目录 前言准备工作试手小案例开始我们今天的案例教学尾语 💝 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! ttkbootstrap 是一个基于 tkinter 的界面美化库, 使用这个工具可以开发出类似前端 bootstrap 风格的 tkinter 桌面程序。 ttkbootstrap …...
基于RK3568的Linux驱动开发—— GPIO知识点(二)
authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主系列基于RK3568的Linux驱动开发——GPIO知识点(一)_daisy.skye的博客-CSDN博客 查看goio使用情况 cat /sys/kernel/debug/gpio 1|rk3568_r:# cat /sys/kernel/debug/gpio gpiochip0: GPIOs 0-3…...
item_get-获得aliexpress商品详情API的调用参数说明
item_get-获得aliexpress商品详情 aliexpress.item_get 公共参数 名称类型必须描述keyString是调用key(免)(测)(试)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中&…...
无需模拟器!Windows运行安卓应用的革命性方案——APK-Installer轻量级安装工具全解析
无需模拟器!Windows运行安卓应用的革命性方案——APK-Installer轻量级安装工具全解析 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在数字化办公与娱乐融…...
基于AkShare构建A股基础数据自动化采集方案
1. 为什么需要自动化采集A股基础数据 做量化研究的朋友都知道,获取准确、完整的股票基础数据是策略开发的基石。我刚开始做量化时,最头疼的就是每次跑策略前都要手动更新股票列表,经常因为数据不全导致回测结果失真。后来发现AkShare这个宝藏…...
保姆级教程:在CompactLogix 5380上配置AB_Socket_TCP库,实现断线重连与自动收发
工业级TCP通信实战:CompactLogix 5380双IP配置与AB_Socket_TCP库深度应用 在工业自动化领域,稳定可靠的通信系统如同生产线的神经系统。当一台CompactLogix 5380控制器需要7x24小时不间断地与上位机、传感器网络或第三方设备交换数据时,传统的…...
OpCore Simplify技术突破:如何用智能适配重构开源系统定制效率
OpCore Simplify技术突破:如何用智能适配重构开源系统定制效率 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在开源系统定制领域&#x…...
Obsidian表格处理革新:Excel插件的无缝集成方案
Obsidian表格处理革新:Excel插件的无缝集成方案 【免费下载链接】obsidian-excel 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-excel 在知识管理的日常工作中,你是否经常遇到这样的困境:在Obsidian中记录项目数据时&#…...
基于YOLOv11深度学习的花卉识别检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
一、项目介绍 花卉识别是计算机视觉在植物学领域的重要应用方向,对于植物分类研究、生态保护、园林管理等领域具有重要意义。然而,由于花卉种类繁多、形态各异,且受光照、角度、遮挡等因素影响,传统方法难以实现高效准确的识别。…...
别再只用Axios了!Vue3项目里用MinIO实现文件上传的保姆级教程(含.env配置避坑)
别再只用Axios了!Vue3项目里用MinIO实现文件上传的保姆级教程(含.env配置避坑) 当你在Vue3项目中需要实现文件上传功能时,第一反应是不是封装一个Axios请求,把文件发送到后端服务器处理?这种传统方案虽然可…...
NormalReconstructZ节点]原理解析与实际应用
的数据丢失问题,确保光照计算的准确性,是高质量实时渲染不可或缺的一环。该节点的设计充分考虑了现代图形硬件的特性,能够在保持高质量视觉效果的同时,显著降低内存带宽和存储空间的需求,特别适合移动平台和性能敏感的…...
告别重复编码:用快马AI一键生成团队协作网盘高效开发框架
最近在开发一个团队协作网盘系统时,发现很多基础功能其实都是重复性工作。比如权限管理、文件版本控制这些模块,每个项目都要从头写一遍。后来尝试用InsCode(快马)平台的AI生成功能,效率提升特别明显。这里分享下我的实践心得: 权…...
Goofys安全最佳实践:保护你的S3文件系统访问的终极指南
Goofys安全最佳实践:保护你的S3文件系统访问的终极指南 【免费下载链接】goofys a high-performance, POSIX-ish Amazon S3 file system written in Go 项目地址: https://gitcode.com/gh_mirrors/go/goofys 在当今云原生时代,安全访问云存储变得…...
