首页 > 编程语言 >C#——多态详情

C#——多态详情

时间:2024-07-09 09:30:01浏览次数:19  
标签:r1 r2 C# 多态 详情 重载 抽象类 方法 Rect

多态

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

多态分为两种 :

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

静态多态

在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。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 子类和"实现接口的类"都把未实现的方法进行实现

标签:r1,r2,C#,多态,详情,重载,抽象类,方法,Rect
From: https://blog.csdn.net/qq_3517289697/article/details/140235368

相关文章

  • 创建vue-cli脚手架项目 和各个文件夹用途(最全面)
    一、安装Vue脚手架1、第一步(仅第一次执行):全局安装@vue/cli npmi@vue/cli-g2、切换到要创建项目的目录,然后创建项目vuecreatehellocli3、 进入项目 cdhellocli4、启动项目npmrunserve(默认一般是可从package.json→scripts下查看 )二、vue-cli脚手架初......
  • SV/UVM 类的多态和虚方法解析
            类具有三大特性:封装/继承/多态,多态是面对对象编程中最神奇的特征,也是最抽象和难以理解的特征。对于初学者来说,最好对sv有了一定了解,在掌握了封装和继承之后再学习多态会更容易理解。1.类的继承    首先复习一下继承的概念:继承是利用共性构建一个基类......
  • 运营商如何与第三方服务商合作,共同建设PCDN网络?
    运营商与第三方服务商合作,共同建设PCDN(P2PCDN)网络,是一个涉及技术、资源、运营等多方面的复杂过程。以下是一些建议的操作步骤:一.明确合作目标与业务模式:1.运营商与第三方服务商首先需要明确合作的目标,例如提升网络覆盖、降低运营成本、提高内容分发效率等。2.根据目标确定合......
  • Linux系统运维命令:查看http的并发请求数及其TCP连接状态(使用netstat结合awk和sort,组合
    一、需求二、解决方法(一)解决思路(二)命令三、实例演示和命令解释(一)实例演示(二)命令解释四、扩展一、需求用户访问一个视频监控平台的web服务特别频繁,据客户说,有大概2000个用户,要随机访问这个视频监控平台,这样对带宽的要求非常大。因此,他们需要查看到底有多少个http的并......
  • C++ 保障异常安全的手段和措施
    在C++中,保障异常安全是编写健壮、可靠代码的重要方面。异常安全确保程序在遇到异常时能够正确处理,不会导致资源泄露或数据不一致等问题。以下是一些保障C++异常安全的手段和措施:1.RAII(资源获取即初始化)RAII是一种在C++中广泛使用的资源管理技术,它通过对象的构造函数获取......
  • SpringBoot使用jdbcTemplate连接人大金仓按月备份表
    方式一:采用SELECT*INTOFROM复制表数据以及结构到新表,再清空原表并重置序列代码如下:点击查看代码privatevoidpnsDataCopy(){log.info("{}===>表开始复制",PNS_TABLE);longl=System.currentTimeMillis();TransactionStatustransactionS......
  • NCCL拓扑管理 - Topo模块
    Topo模块提供System拓扑和Graph拓扑的构建接口,依赖XML模块。链路链路带宽NCCL对不同链接进行建模,但数值的绝对值看起来并不准,笔者估计代码开源时做了保密处理,但只要数值的相对值不影响拓扑搜索便对执行逻辑没有影响,所以无需较真这些带宽数值。#defineLOC_BW5000.0#de......
  • camunda快速入门(四):如何设计一个带条件分支的流程
    在本节中,您将学习如何使用BPMN2.0排他网关(ExclusiveGateways)使流程更加动态。1、添加两个网关我们想修改我们的流程,使其更具动态性。为此,请在CamundaModeler中打开该过程。接下来,从Modeler的左侧菜单中,选择网关形状(菱形)并将其拖动到“开始事件”和“服务任务”之间的......
  • camunda快速入门(五):DMN规则引擎如何使用
    在本节中,您将学习如何使用BPMN2.0业务规则任务和DMN1.3决策表将决策自动化添加到流程中。1、将业务规则任务添加到流程使用CamundaModeler打开PaymentRetrieval(付款检索)流程,然后单击“ApprovePayment(批准付款)”任务节点。在扳手按钮菜单中将活动类型更改为“Business......
  • INFOGR: Graphics Rasterization
    2023/2024,4thperiodINFOGR:GraphicsPractical2:RasterizationAuthor:PeterVangorp,basedonapreviousversionbyJaccoBikkerTheassignment:ThepurposeofthisassignmentistocreateasmallOpenGL-based3Dengine,startingwiththeprovided......