最新要闻
- 每日视点!便宜香港主机推荐
- 环球速递!秒变大屏平板!三星将推新款折叠手机:双铰链、三折叠
- 天天报道:专家评中国为何没跟上ChatGPT浪潮:0-1的事情没人做
- 电动车价格还得降 宁德钠离子电池今年量产:高寒地区突出优势
- 广汽埃安新车慢充失灵 车主:4S店给补偿 但协议他不想签
- 天天热推荐:日本声优网络发文吐槽外送被打翻 网友:小心隐私
- 普京称嫉妒的人才说俄依赖中国 欧洲应该想想自己
- 甲醛滤芯永不更换!米家全效空气净化器评测:不仅除尘、还能杀死H1N1病毒
- 顺丰开通贵州茅台首条全货机航线 10余吨酒、茶特产首飞成功
- 每日资讯:飞机航班为何不卖站票?大V科普:并非航空公司良心
- 罕见5风扇设计!铭瑄RTX 4070 Ti MGG OC12G显卡图赏
- 三电升级、寿命翻倍!绿源液冷2.0系统升级上线:能骑十年
- 以铜之名尽显千年风流
- 全球信息:打造中国ChatGPT 搜狗输入法之父马占凯加入王慧文AI团队
- 独一无二木星纹理见过么?一加11推出木星岩限定版:100%手工挑选
- 环球快看:曾被宣布“野外灭绝” 长江鲟时隔23年首次自然产卵
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
当前关注:C#多态性学习,虚方法、抽象方法、接口等用法举例
1. 多态性定义
C#中的多态性是OOP(面向对象编程)的一个基本概念,它允许一个对象在不同情况下表现出不同的行为,以增强代码的可重用性和灵活性。 根据网上的教程,我们得知C#多态性分为两类,静态和动态。但实际上,C#没有严格的静态和动态多态性的分法。之所以这么分,还是为了我们便于理解,我们沿用这个思维来大概分类:
采用函数重载或运算符重载方法的,属于静态多态性;采用虚方法、抽象方法、接口等方式,属于动态多态性。
拓展:在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。什么意思呢?在静态语言中,许多多态性的特性可以在编译时确定,编译器可以根据数据类型的信息来确定方法的调用方式。而在动态语言中,数据类型的确定通常是在运行时进行的,这种行为被称为动态多态性。
【资料图】
2. 函数重载示例
函数重载是指在同一个类中,定义多个方法,它们的方法名相同,但是参数类型、参数数量、参数顺序不同。以下是一个函数重载的例子:
public class Calculator{ public int Add(int a, int b) { return a + b; } public int Add(int a, int b, int c) { return a + b + c; } public float Add(float a, float b) { return a + b; } public double Add(double a, double b) { return a + b; }}
在这个例子中,Calculator类定义了4个Add()方法,它们的方法名相同但是参数列表不同(分别有2个整型参数、3个整型参数、2个浮点型参数、2个双精度浮点型参数)。这些方法根据声明的参数类型和数量而得到不同的签名,因此构成函数重载,当调用Add()方法时,编译器会根据参数的类型和数量来选择正确的方法重载进行调用。
3. 虚方法示例
虚方法和重写(override)方法:在父类中声明一个虚方法,子类可以重写该方法并实现自己的行为。在运行时,程序根据对象的实际类型调用相应的方法。这种方式也称为“消除静态绑定”。注意事项:虚方法是使用关键字 virtual 声明的。同时继承类中的重写虚函数需要声明关键字 override 。下面是一个示例:
// 定义一个Animal类和其子类class Animal{ public virtual void Speak() { Console.WriteLine("I am an animal."); }}class Dog : Animal{ public override void Speak() { Console.WriteLine("Woof!"); }}class Cat : Animal{ public override void Speak() { Console.WriteLine("Meow!"); }}// 示例程序class Program{ static void Main(string[] args) { Animal[] animals = new Animal[2]; animals[0] = new Dog(); animals[1] = new Cat(); foreach (Animal animal in animals) { animal.Speak(); } Console.ReadKey(); }}
在这个例子中,Animal类中声明了一个虚方法Speak(),它的子类 Dog 和 Cat 分别对该方法进行了重写。在Main 方法中,创建了一个 Animal 数组,其中存放了 Dog 和 Cat 的实例。在foreach循环中,程序根据实际对象类型调用了不同的Speak()方法,实现了多态性的效果。
小拓展:关键字重写 override 与覆盖 new 较为容易搞混,有关两者区别可移步:C#中重写(override)及覆盖(new)的区别详解。
4. 抽象方法示例
抽象方法是在抽象类中定义的,它没有具体实现的代码,而只是定义了方法的名称、参数和返回值类型等信息。抽象方法必须在子类中进行完整的实现,否则子类本身也必须定义为抽象类。使用abstract关键字来定义抽象类和抽象方法。下面的示例演示了如何定义并使用抽象方法:
abstract class Shape { public abstract double Area(); // 定义抽象方法Area()}// 派生类Rectangle继承抽象类Shapeclass Rectangle : Shape { double width, height; public Rectangle(double w, double h) { width = w; height = h; } public override double Area() // 实现抽象方法Area() { return width * height; }}class Triangle : Shape { double baseValue, height; public Triangle(double bv, double h) { baseValue = bv; height = h; } public override double Area() // 实现抽象方法Area() { return baseValue * height * 0.5; }}class Program { static void Main(string[] args) { Rectangle r = new Rectangle(5, 8); Console.WriteLine("矩形的面积 = {0}", r.Area()); Triangle t = new Triangle(5, 8); Console.WriteLine("三角形的面积 = {0}", t.Area()); }}
上面的代码定义了Shape类和两个派生类Rectangle和Triangle。Shape类中定义了一个抽象方法Area(),并在Rectangle和Triangle中实现了这个抽象方法。在Main方法中,创建了一个Rectangle对象 r 和一个Triangle对象 t,并分别调用它们的Area()方法计算出它们的面积。
5. 接口示例
C#接口是一种约定,是一个抽象的类型,它定义了一组公共的方法、属性、索引器和事件,这些成员没有实现细节和实现代码,只定义了接口的行为。
5.1 接口语法
定义接口的语法如下:
interface 接口名称{ 方法1 方法2 属性1 索引器1 事件1}
其中,方法、属性、索引器和事件都是接口的成员,它们都没有实现,只是定义了行为的名称和参数。
方法定义的语法如下:返回类型 方法名称(参数列表);
属性定义的语法如下:属性类型 属性名称 { get; set; }
索引器定义的语法如下:索引器类型 this[索引器参数] { get; set; }
事件定义的语法如下:event 事件委托类型 事件名称;
其中,事件委托类型是一个Delegate类型。
5.2 接口使用示例
定义一个接口之后,可以通过继承或实现来使用接口。接口的继承使用“:”符号,需要注意的是,如果一个类实现了一个接口,那么它必须实现接口中所有的方法和属性。下面是接口示例:
interface IShape{ double Perimeter(); double Area();}interface ICircle : IShape{ double Radius { get; set; }}interface IRectangle : IShape{ double Width { get; set; } double Height { get; set; }}class Circle : ICircle{ public double Radius { get; set; } public double Perimeter() { return 2 * Math.PI * Radius; } public double Area() { return Math.PI * Radius * Radius; }}class Rectangle : IRectangle{ public double Width { get; set; } public double Height { get; set; } public double Perimeter() { return 2 * (Width + Height); } public double Area() { return Width * Height; }}class Program{ static void Main(string[] args) { Circle c = new Circle(); c.Radius = 1; Console.WriteLine("Circle: Perimeter = {0}, Area = {1}", c.Perimeter(), c.Area()); Rectangle r = new Rectangle(); r.Width = 2; r.Height = 3; Console.WriteLine("Rectangle: Perimeter = {0}, Area = {1}", r.Perimeter(), r.Area()); }}
上面的代码定义了IShape、ICircle和IRectangle三个接口、以及Circle和Rectangle两个类。其中,Circle类实现了ICircle接口,Rectangle类实现了IRectangle接口。在Main方法中,创建了一个Circle对象和一个Rectangle对象,并给它们的属性赋值。然后分别调用了Circle和Rectangle对象的Perimeter()和Area()方法输出结果。运行程序,输出以下结果:
Circle: Perimeter = 6.28318530717959, Area = 3.14159265358979Rectangle: Perimeter = 10, Area = 6
可以看到,通过使用接口,我们可以很方便地定义出不同的形状,然后计算出它们的周长和面积。这就展示了接口在C#编程中的重要地位。
想必大家看到这里对于多态性的实现方式已经有了一定的了解,不知大家是否发现,这些方式中,抽象方法和虚方法是如此的相似,那么我们就有了新的疑问:两者有何区别?使用场景是否有所不同?
在下面这篇随笔中,我针对这个问题进行了深入学习:C#中抽象方法与虚方法的区别。
关键词:
-
即时:【必须收藏】别再乱找TiDB 集群部署教程了,这篇保姆级教程来帮你!!| 博学谷狂野架构师
TiDB基础使用TiDBdashboard使用TiDBDashboard是TiDB自4 0版本起提供的图形化界面,可用于监控及诊断TiDB集群。TiDBDashboard内
来源: 即时:【必须收藏】别再乱找TiDB 集群部署教程了,这篇保姆级教程来帮你!!| 博学谷狂野架构师
当前关注:C#多态性学习,虚方法、抽象方法、接口等用法举例
python中index()、find()方法
每日视点!便宜香港主机推荐
环球速递!秒变大屏平板!三星将推新款折叠手机:双铰链、三折叠
天天报道:专家评中国为何没跟上ChatGPT浪潮:0-1的事情没人做
电动车价格还得降 宁德钠离子电池今年量产:高寒地区突出优势
广汽埃安新车慢充失灵 车主:4S店给补偿 但协议他不想签
天天热推荐:日本声优网络发文吐槽外送被打翻 网友:小心隐私
天天精选!批量上传iOS应用程序截图的实用技巧
天天热头条丨OPPO发布新机|无感验证护航“黄牛党”退退退!
环球滚动:易基因:肠道菌群:早产儿出生后不同时间点肠道微生物定植的动态变化|项目文章
快播:Qt 博客汇总
天天热推荐:图片识别文字(批量图片文字查找分类)
普京称嫉妒的人才说俄依赖中国 欧洲应该想想自己
科创板收盘播报:科创50指数探底回升跌0.33% 软件服务类个股表现强势
甲醛滤芯永不更换!米家全效空气净化器评测:不仅除尘、还能杀死H1N1病毒
顺丰开通贵州茅台首条全货机航线 10余吨酒、茶特产首飞成功
每日资讯:飞机航班为何不卖站票?大V科普:并非航空公司良心
罕见5风扇设计!铭瑄RTX 4070 Ti MGG OC12G显卡图赏
三电升级、寿命翻倍!绿源液冷2.0系统升级上线:能骑十年
Transformer详解
全球速递!解决google翻译出错问题
世界通讯!【高端访谈】“开放的中国大市场蕴藏更多新机遇”——访马士基首席执行官柯文胜
以铜之名尽显千年风流
全球信息:打造中国ChatGPT 搜狗输入法之父马占凯加入王慧文AI团队
独一无二木星纹理见过么?一加11推出木星岩限定版:100%手工挑选
环球快看:曾被宣布“野外灭绝” 长江鲟时隔23年首次自然产卵
当前速读:ubuntu 使用vsftpd搭建FTP服务器
全球热议:6.824-lab2-Raft简述
环球滚动:Template模板类
全球讯息:【Visual Leak Detector】配置项 VLD
【速看料】火山引擎 DataTester:构建增长闭环,3-5 人即可搭建企业增长团队
【新要闻】曾因配料“双标”遭网友痛批 好丽友漏税22万被罚12万
全球时讯:空姐为美容注射玻尿酸:打进血管 险丧命
三星W799哪年上市的?三星W799可以安装微信吗?
诺基亚920还能用吗?诺基亚920手机参数
英雄联盟手游大师多少颗星上宗师?英雄联盟几级可以组队匹配?
总线上的音频设备前是感叹号是什么原因?总线上的音频设备前是感叹号怎么处理?
华为合约机是什么意思?华为合约机和官方标配区别有哪些?
C#遍历指定文件夹中所有文件的3种方法
天天热议:Sed 备忘清单_开发速查表分享
史上最严奶粉新国标实施逾月 贝因美又一款二注奶粉上新 哪些信号值得关注?
热推荐:甘肃将为兰州牛肉拉面立法 网友:建议牛肉有重量标准
热点在线丨《原神》地位不保?开放世界游戏《鸣潮》实机画面公布
环球简讯:曹德旺:大学生去送外卖 和在学校没学到东西有关
任性钻“夹缝”被撞旋转1080° 司机甩锅:都怪后车开太快了
当前快播:判赔370万!中创新航回应不正当竞争案判决:未曾挖角宁德时代 将上诉
天天百事通!OpenIddict使用教程
流量分析入门
全球观速讯丨MySql随笔记基础
【高端访谈】强化城投债与量化领域主动管理 打造私募“固收+”独特策略——专访国恩资本董事总经理杨先哲
通讯!旃怎么读音(旃怎么读)
36年前电脑用上AI:IBM 5155运行ChatGPT是什么样?
环球看热讯:清晰度和功耗完美平衡!真我GT Neo5系列宣布告别1080P:普及1.5K屏
罕见!超级火流星划过北京夜空被拍下:彩色拖尾 爆裂闪光
每日快讯!《生化危机4:重制版》阿什莉模型展示:物理晃动效果很优秀
全球快看点丨车评人曝奔驰4S维修黑幕:一个迈巴赫大灯小20万 故意损坏夸大车损
即时:数据库系统原理之SQL与关系数据库基本操作
每日焦点!【解答】如何保障ETL过程的数据正确性。这个过程会产生哪些问题?
世界要闻:DHCP snooping
全球快播:SSH配置别名登录
天天快报!越来越没人买了?雷克萨斯国内销量出炉:同比爆降36%
女子给猴子喂食被掌掴 景区回应:含保险、打疫苗可理赔
全球看热讯:去年火遍全网!贵州“村BA”现场水泄不通:村草村花“蹦苗迪”
热资讯!最高等级!英国最大陆上油田漏油:已成立黄金指挥部
头条焦点:消息称百度文心一言云服务发布会取消:延期对外发布
焦点快看:2023年底产能破30GW!协鑫集成阜宁12GW组件项目开工 -->
Spring源码核心剖析
焦点热门:计算机解决高中离子浓度计算
最新资讯:微软或提高Win12升级门槛:SSD成为刚需
19.48万元起 国产豪华轿车红旗H6预售:双中置排气着实罕见
焦点速看:赵长江:腾势D9新增订单一天破500台!别克GL8危险了
【世界播资讯】只差价格了 Redmi新机爆料汇总 1999元起交个朋友?
环球动态:市场震荡分化 软件行业红利不断
【全球独家】你不知道的ubuntu DIY发行版
全球快消息!2022年度十大科学辟谣榜出炉:O型血更招蚊子是谣言、变电站很危险?
男子爬树看邓紫棋演唱会致手臂骨折 省1千花1万:网友直呼追星也要注意安全
华海诚科网上发行最终中签率为0.0363%
专家解读消费基础设施纳入公募REITs试点:推动消费扩容提质 并非简单为房企提供资产处置渠道
天天最新:主板注册制新股开启申购 投资者打新须适应新规则
今日观点!国际金融市场早知道:3月27日
速读:票房破3亿!新海城电影《铃芽之旅》拿下2023年引进片票房冠军
新一轮国内油价将于3月底调整:目前分析大概率下调
今日播报!头部车企打架尾部遭殃 恒驰汽车北京仅剩一家门店营业
读Java性能权威指南(第2版)笔记29_线程和同步性能下
【热闻】95后夫妻摆摊日入9千网友让查税慌了 本人回应:当日是偶然 但生意也不错
【环球新视野】ctf反序列化练题
全球新资讯:win32com操作word 第十五 Find接口的使用
院士:抗流感特效药“达菲”原料为八角茴香、附加值提升1100多倍
口碑并入高德:这是要和美团、抖音拼了?
速递!我国首次实现固态氢能发电并网!密度提高20倍
讯息:镗削
当前短讯!转注是什么_转注是什么意思
【Visual Leak Detector】QT 中 VLD 输出解析(三)
快报:北大"韦神"出难题:没想到 初二学生给出标准答案!ChatGPT被难倒
环球关注:MM32 SPIN MCU 电机 FOC 驱动 风机无传感器弦波驱动篇应用笔记
前端设计模式——路由模式
【全球新视野】Mysql 查询指定节点的所有子节点
当前动态:NVIDIA显卡突然解锁视频编码限制:9年前老卡欢呼雀跃