C#——多态详情

多态

多态: 是同一个行为,具有多个不同表现形式或形态的能力

多态分为两种 :

静态性多态: 函数重载,符号重载动态性多态: 虚方法,抽象类,接口

静态多态

在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为:

•函数重载
•运算符重载

静态多态之函数重载

函数重载: 在同一个范围内对相同的函数名有多个定义,必须保持函数名一样 但参数类型或者参数的个数 或者方法的返回值不一样

静态函数之符号重载

运算符重载是指允许用户使用自己定义的类型编写运算符号,同时还允许用户定义的类型与预定义的类型具有相同的功能。符号重载就是把已经定义的、有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能。(比如两个类相加)因此,在C#语言中,允许用户定义的类型通过使用operator关键字定义成静态成员函数的形式来重载运算符。

符号重载:// +(正)一(负)!~++—-一元运算符号可以重载/ /+―*/%// =! > < >= <= / / = !> <>=<=// && || 不能直接重载// += -= *= /= %= 不能重载// =?: new is 不能重载

符号重载是一个方法,可以有返回值的方法,关键字operator符号 进行重载时,参数必须是包含类型 本类类型

接下来变为大家分享一下如何封装符号重载 ​
     封装符号重载的类//符号重载的多态class Rect{public double Length;public double Width;public double Height;public double Volume;public Rect(){}//有参数的构造函数public Rect(double l, double w, double h){Length = l;Width = w;Height = h;}~Rect(){Console.WriteLine("析构函数,当对象被释放的时候出发构习函数把一个对象null 然后通过Gc垃圾回收之后触发");}//计算体积的方法public double GetV(){return Length * Width * Height;}// ====================符号重载方法=========================//符号重载: 是一个方法,有返回值的方法,关键字operator符号public static Rect operator +(Rect r1, Rect r2)// 使用+重载方法传递两个Rect对象{Rect r3 = new Rect();r3.Length = r1.Length + r2.Length;r3.Width = r1.Width + r2.Width;r3.Height = r1.Height + r2.Height;r3.Volume = r3.GetV();return r3;}// 进行重载时,参数必须是包含类型 本类类型public static int operator -(Rect r1, Rect r2){// r1的面积-r2的面积int a = Convert.ToInt16((r1.Length * r1.Width + r1.Length * r1.Height + r1.Width * r1.Height)-(r2.Length * r2.Width + r2.Length * r2.Height + r2.Width * r2.Height));return a;}// 重载==和!=需要一起写// 重载==public static bool operator == (Rect r1, Rect r2){bool b = r1.GetV() == r2.GetV()?true:false;return b;}// 重载!=public static bool operator !=(Rect r1, Rect r2){bool b = r1.GetV() != r2.GetV() ? true : false;return b;}}
调用该方法
        // 创建第一个rect对象Rect r1 = new Rect(2,5,4);// 创建第二个rect对象Rect r2 = new Rect(3, 6, 9);// 使用加号把r1+r2进行相加Rect r3 = r1 + r2;Console.WriteLine(r3.Height);Console.WriteLine(r1 - r2);Console.Read();

密封类

密封类使用sealed关键字定义,它不能被继承

继承的话会报错

动态性多态

C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。

动态性多态之虚方法

当父类有一个方法,子类使用继承可以把父类方法继承过去.如果在子类想定义继承过来方法重名的方法,需要在父类把这个方法定义后的方法,在子类的方法定义使用重写方法

1 当父类有一个方法需要在继承的类实现时候,可以使用虚方法2 使用virtual()进行定义虚方法3 虚方法可以在子类进行添加overrider进行重写

实例 :

动态性多态之抽象类
抽象类

        抽象类使用 abstract定义抽象类

        抽象类只是用来举例一个类所具备的行为,不能通过new 创建对象

        抽象类可以有抽象方法,只有声明部分 没有实现部分

        抽象类里面也可以有普通方法

        抽象类不能是static(静态) 也不能是scaled(密封)

抽象方法:

        1 只能定义在抽象类里面,在方法前面添加abstract进行修饰

        2 只有声明 没有实现部分

        3 抽象方法在子类被实现 需要再子类的方法前面添加overrier关键字

        4 子类必须重写所有的父类的抽象方法,除非子类也是抽象方法

实例:

动态性多态之接口
接口:

        使用interface关键字定义接口 以后一般以I开头进行命名

        接口中的属性方法等只做一个声明,没有任何实现。

        接口当中的属性和方法默认都是public的。

接口的特点:                                                                                        

        1 接口具有强制性,必须对接口里面属性和方法进行实现

        2 接口可以实现(:)另外一个接口,类可以实现一个接口或者多个接口

实例:

当子类同时继承接口和基类时,接口需要写在最后面

接口和抽象类的区别

不同点:

        1 抽象类关键字abstract(爱步丝拽个它),接口的关键字interface (int肥死)
        2 一个类只能继承一个抽象类,一个类可以实现多个接口
        3 抽象类可以定义抽象方法,非抽象子类必须实现父类的抽象方法;
        4 接口必须实现接口里面所有属性和方法
        5 实现抽象方法需要关键字overrider (哦哇ruai的),接口直接实现就行

相同点:

        1 都不能通过new直接实例化
        2 都包含未实现的方法
        3 子类和"实现接口的类"都把未实现的方法进行实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42771.shtml

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

相关文章

知识图谱的符号表示

1、基于图的表示建模 2、有效标记图 3、属性图表示方法的优点和去点 4、RDF是什么&#xff1f;表达是有限的 5、OWL&#xff0c;本体语言 6、OWL有很多家族 7、属性图、RDF\三元组、关系图 ---------------------------PPT---------------------

已解决 javax.xml.transform.TransformerFactoryConfigurationError 异常的正确解决方法,亲测有效!!!

已解决 javax.xml.transform.TransformerFactoryConfigurationError 异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 一、问题分析 二、报错原因 三、解决思路 四、解决方法 五、总结 博主v&#xff1a;XiaoMing_Java 博主v&#x…

【微服务网关——服务发现】

1.服务发现 1.1 介绍 服务发现是指用注册中心来记录服务信息&#xff0c;以便其他服务快速查找已注册服务服务发现分类: 客户端服务发现服务端服务发现 1.2 客户端服务发现 客户端服务发现&#xff08;Client-side Service Discovery&#xff09;是一种微服务架构中的模式…

Vine: 一种全新定义 Vue 函数式组件的解决方案

7月6日的 vue confg 大会上 ShenQingchuan 大佬介绍了他的 Vue Vine 项目&#xff0c; 一种全新定义 Vue 函数式组件的解决方案。 和 React 的函数式组件有异曲同工之妙&#xff0c;写起来直接起飞了。 让我们来快速体验一下 vine&#xff0c; 看看到底给我们带来了哪些惊喜吧…

[Python]配置邮件服务,发送邮件

本文以163邮件系统为例&#xff0c;登录之后&#xff0c;点击设置&#xff0c;开启如下设置项。 即可使用代码发送邮件&#xff0c;并携带附件。 开启SMTP 普通邮件 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart# 1…

[算法] 优先算法(四):滑动窗口(下)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

20240708 每日AI必读资讯

&#x1f916;破解ChatGPT惊人耗电&#xff01;DeepMind新算法训练提效13倍&#xff0c;能耗暴降10倍 - 谷歌DeepMind研究团队提出了一种加快AI训练的新方法——多模态对比学习与联合示例选择&#xff08;JEST&#xff09;&#xff0c;大大减少了所需的计算资源和时间。 - JE…

Java线程的创建·启动和休眠

一.线程的创建和启动 Java中创建线程的两种方式 ◆继承java.lang.Thread类 ◆实现java.lang.Runnable接口 ◆使用线程的步骤 继承Thread类创建线程 ◆自定义线程类继承自Thread类 ◆重写run()方法&#xff0c;编写线程执行体 ◆创建线程对象&#xff0c;调用start()方法启动…

目标检测YOLO实战应用案例100讲-基于深度学习的无人机影像小目标识别(续)

目录 3.2 实验平台和环境 3.3 实验评价指标 3.4 基础框架YOLOv5在无人机数据集上的实验 3.4.1 实验结果 3.4.2 结果分析 4基于深度学习的无人机影像目标检测算法 4.1 基于改进YOLOv5的小目标检测算法研究 4.1.1 增加注意力机制 4.1.2 增加检测层 4.1.3多尺…

2024年 春秋杯 网络安全联赛夏季赛 Web方向 题解WirteUp 部分

brother 题目描述&#xff1a;web哥&#xff0c;打点容易提权难。 打点就是最简单的SSTI。 执行下find / -user root -perm -4000 -print 2>/dev/null找一下具备suid权限的命令 /usr/lib/dbus-1.0/dbus-daemon-launch-helper /usr/bin/chsh /usr/bin/gpasswd /usr/bin/n…

互联网十万个为什么之什么是数据备份?

数据备份是按照一定的备份频率创建数据副本的过程&#xff0c;将重要的数据复制到其它位置或者存储介质&#xff0c;并对生成的副本保留一定的时长。备份通常储存在不同的物理介质或云端&#xff0c;以确保数据的连续性和完整性。有效的备份策略至关重要&#xff0c;以防止数据…

macos 10.15系统下载包,macOS Catalina for mac

macOS Catalina 让你喜欢的种种 Mac 体验都更进一步。你可以领略音乐、播客这两款全新 Mac app 的表演&#xff1b;在 Mac 上畅享各款自己心爱的 iPad app&#xff1b;拿起 iPad 和 Apple Pencil&#xff0c;拓展工作空间&#xff0c;释放创意灵感&#xff1b;再打开那些平时常…

【STL】vector的模拟实现

目录 vector的介绍和使用 vector的介绍 vector的使用 构造函数 迭代器 空间增长问题 vector的增删查改等 vector的迭代器失效问题 vector的模拟实现 insert reserve push_back push_front resize erase pop_back pop_front 代码 vector的介绍和使用 vecto…

【PB案例学习笔记】-29制作一个调用帮助文档的小功能

写在前面 这是PB案例学习笔记系列文章的第29篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

个人视角,社会影响力:自媒体的魅力所在

随着数字化时代的到来&#xff0c;自媒体正成为信息传播领域的一场革命。个人视角与社会影响力的结合&#xff0c;赋予了自媒体独特的魅力。在传统媒体受限制的同时&#xff0c;自媒体为每个人提供了表达自己观点和思想的自由。个体的真实视角使得自媒体在信息传播中发挥着重要…

14-40 剑和诗人14 - 为什么机器学习需要合成数据

​​​​​​ 数据是人工智能的命脉。如果没有高质量、有代表性的训练数据&#xff0c;我们的机器学习模型将毫无用处。但随着神经网络规模越来越大、人工智能项目越来越雄心勃勃&#xff0c;人们对数据的需求也越来越大&#xff0c;我们面临着一场危机——现实世界的数据收集和…

如何优化 PostgreSQL 中对于复杂数学计算的查询?

文章目录 一、理解复杂数学计算的特点二、优化原则&#xff08;一&#xff09;索引优化&#xff08;二&#xff09;查询重写&#xff08;三&#xff09;数据库配置调整&#xff08;四&#xff09;使用数据库内置函数的优势 三、具体的优化方案和示例&#xff08;一&#xff09;…

华为开源自研AI框架昇思MindSpore应用案例:FCN图像语义分割

Mask R-CNN MaskRCNN是一种概念简单、灵活、通用的目标实例分割框架&#xff0c;在检测出图像中目标的同时&#xff0c;还为每一个实例生成高质量掩码。这种称为Mask R-CNN的方法&#xff0c;通过添加与现有边框检测分支平行的预测目标掩码分支&#xff0c;达到扩展Faster R-CN…

leetcode判断二分图

判断二分图 图的问题肯定要用到深度优先遍历或者广度优先遍历&#xff0c;但又不是单纯的深度优先遍历算法和广度优先遍历算法&#xff0c;而是需要在遍历的过程中加入与解决题目相关的逻辑。 题干中说了&#xff0c;这个图可能不是连通图&#xff0c;这个提示有什么作用呢&a…

shared_ptr 线程安全

为什么 shared_ptr 可以安全地在多个线程中共享&#xff1f; 循环引用 因为shared_ptr std::shared_ptr 的引用计数是线程安全的。这意味着你可以在多个线程中安全地拷贝、赋值和销毁 std::shared_ptr。然而&#xff0c;访问或修改 shared_ptr 所指向的对象时&#xff0c;需要…