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.mfbz.cn/a/782576.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何恢复已删除的音频文件

设备中文件被意外删除并不是什么新鲜事。但是&#xff0c;如果文件是你最喜欢的 MP3 歌曲&#xff0c;那就太令人沮丧了。但你知道吗&#xff0c;有一种方法可以从 Windows 机器中恢复已删除的音乐文件。尝试奇客数据恢复并检索已删除的音频文件。虽然产品名称听起来不像可以帮…

【C语言】C语言编译链接和Win32API简单介绍

目录 翻译环境和运行环境翻译环境编译器预处理&#xff08;预编译&#xff09;编译链接 执行环境 Win32API是什么控制台程序控制台获取坐标COORDGetStdHandle函数GetConsoleCursorinfo函数CONSOLE_CURSOR_INFOSetConsoleCursorInfo函数SetConsoleCursorPostion函数GetAsyncKeyS…

如何在Spring Boot中实现分布式任务调度?

文章目录 引言一、分布式任务调度的基本原理二、Spring Boot与分布式任务调度1. 使用Quartz实现分布式任务调度2. 使用Elastic-Job实现分布式任务调度 三、常见问题与解决方案结论 &#x1f389;欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;…

世优科技获新锐商业价值奖,数字人阿央入选北京市元宇宙“名人”

2024全球经济大会元宇宙创新发展论坛暨2024第九届“创客中国”元宇宙中小企业创新创业大赛&#xff0c;由工业和信息化部网络安全产业发展中心、北京市经济和信息化局、石景山区人民政府、首钢集团有限公司主办&#xff0c;围绕元宇宙底层技术端和产业应用端两个方向&#xff0…

Polar Si9000软件详细使用教程

Polar Si9000软件是一款简单易用的阻抗计算神器&#xff0c;文本详细介绍该软件的使用。 一、安装 网上很多安装包&#xff0c;这里不赘述&#xff0c;需要注意的是&#xff0c;如果要希望使用中文版&#xff0c;需要在如下路径中放入简体中文配置文件&#xff08;PJ包一般会有…

C++和Python蚂蚁搬食和蚊虫趋光性和浮标机群行为算法神经网络

&#x1f3af;要点 &#x1f3af;机器人群行为配置和C行为实现&#xff1a;&#x1f58a;脚底机器人狭隘空间导航避让障碍物行为 | &#x1f58a;脚底机器人使用摄像头耦合共振&#xff0c;实现同步动作 | &#x1f58a;脚底机器群使用相机&#xff0c;计算彼此间“分子间势能…

数据库性能优化系统设计

设计一个数据库性能优化系统&#xff0c;目标是监测、诊断并改善数据库的运行效率&#xff0c;确保系统能够高效稳定地处理大量数据请求。以下是一个概要设计&#xff0c;包括关键模块、功能和实现思路&#xff1a; 1. 系统架构 分布式监控中心&#xff1a;采用分布式架构收集…

码云远程仓库, 回滚到指定版本号

1. 打开项目路径, 右击Git Bash Here 2. 查找历史版本 git reflog 3. 回退到指定版本 git reset --hard 版本号 4. 强制推送到远程 git push -f

如何在 PostgreSQL 中实现数据的增量备份和恢复?

文章目录 一、增量备份的原理二、准备工作&#xff08;一&#xff09;环境配置&#xff08;二&#xff09;创建测试数据库和表&#xff08;三&#xff09;插入初始数据 三、全量备份四、基于时间点的增量备份&#xff08;一&#xff09;开启 WAL 归档&#xff08;二&#xff09…

继承(上):基类和派生类对象赋值转换,继承中的作用域,派生类的默认成员函数

1.继承的概念及定义 1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的…

PostgreSQL 如何解决数据迁移过程中的数据类型不匹配问题?

文章目录 一、了解常见的数据类型不匹配情况1. 整数类型差异2. 浮点数类型差异3. 字符类型差异4. 日期和时间类型差异 二、解决数据类型不匹配的一般策略1. 数据转换2. 调整数据库表结构3. 数据清洗和预处理 三、PostgreSQL 中的数据类型转换函数1. 数值类型转换2. 字符类型转换…

数据结构(一)C语言补

数据结构 内存空间划分 一个进程启动后&#xff0c;会生成4G的内存空间 0~3G是用户空间(应用层) 3~4G是内核空间(底层) 0~3G 3~4G 所有的进程都会共享3G~4G的内核空间&#xff0c; 但是每个进程会独立拥有0~3G的用户空间。 栈区 存放数据特点 栈区存放数据的申请空间的先后…

算法:[动态规划] 斐波那契数列模型

目录 题目一&#xff1a;第 N 个泰波那契数 题目二&#xff1a;三步问题 题目三&#xff1a;最小花费爬楼梯 题目四&#xff1a;解码方法 题目一&#xff1a;第 N 个泰波那契数 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 …

水冷液冷负载系统的六种基本类型

您可以选择六种基本类型的冷却系统&#xff0c;以满足负载的冷却需求。每个人都有其优点和缺点。本文旨在识别不同类型的冷却系统并确定它们的优缺点&#xff0c;以便您可以根据自己的需求做出明智的选择。 液体冷却系统有六种基本类型&#xff1a; 1.液对液 2.闭环干燥系统…

HackTheBox--Headless

Headless测试过程 1 信息收集 NMAP端口扫描 nmap -sSCV 10.10.11.85000端口测试 检查页面功能&#xff0c;请求 For questions 功能&#xff0c;跳转到 /support 目录 目录扫描 发现 /dashboard 目录 访问 /dashboard 目录&#xff0c;显示未认证&#xff0c;如果通过认证…

git杂记

git 安装&#xff1a; 在 Windows 上安装 Git 也有几种安装方法。 官方版本可以在 Git 官方网站下载。 打开 https://git-scm.com/download/win&#xff0c;下载会自动开始。 要注意这是一个名为 Git for Windows 的项目&#xff08;也叫做 msysGit&#xff09;&#xff0c;和…

高薪程序员必修课-JVM创建对象时如何解决多线程内存抢占问题

前言 在JVM中&#xff0c;堆的内存分配过程涉及到线程安全性的保障&#xff0c;具体来说涉及到对象的内存分配时&#xff0c;并不是简单的抢占式分配&#xff0c;而是通过一些机制来保证线程安全和高效的内存管理。下面解释一下JVM是如何设计来保证线程安全的&#xff1a; 内存…

Go语言---接口interface、接口转换、继承、类型查询

接口(interface)概念 在 Go 语言中&#xff0c;接口(interface)是一个自定义类型&#xff0c;接口类型具体描述了一系列方法的集合。 接口又称为动态数据类型&#xff0c;在进行接口使用的的时候,会将接口对位置的动态类型改为所指向的类型&#xff0c;会将动态值改成所指向类…

Kafka抛弃Zookeeper后如何启动?

Kafaka如何下载 官网地址 目前Kafka最新的版本就是3.7.1 我们可以看到下面这两个版本信息&#xff1f;什么意思呢&#xff1f; Scala 2.12 - kafka_2.12-3.7.1.tgz (asc, sha512)Scala 2.13 - kafka_2.13-3.7.1.tgz (asc, sha512) 我们应该知道&#xff0c;一个完整的Kafka实…

塑料法兰的标准

塑料法兰的标准包括国标GB/T9112-2010、化工部标准HG5010-52&#xff5e;HG5028-58、机械部标准JB81-59&#xff5e;JB86-59、以及船用生活给排水塑料管法兰的标准CB/T 4138-2011和CB/T 4454-2017。这些标准涵盖了从国家标准到特定用途&#xff08;如船用&#xff09;的详细规范…