C#学习相关系列之abstract和virtual用法

一、abstract抽象类用法

1、抽象类的用途

        一个类设计的目的是用来被其他类继承的,它代表一类对象的所具有的公共属性或方法,那么这个类就应该设置为抽象类。

        抽象类是一种特殊的类,它不能被实例化,只能作为基类来派生出其它的具体类。抽象类使用abstract关键字来声明,其中可以包含抽象方法、虚方法、常规方法和属性。抽象类的主要作用是为其派生类提供一个通用的抽象基类。

        抽象方法是一种没有实现的方法,它只有定义并且声明,没有具体实现。抽象方法使用abstract关键字来声明,在抽象类中定义,而其具体实现必须在派生类中实现。抽象方法的主要作用是为其派生类提供一个统一的方法接口。

抽象类的使用场景:

  • 在类库中定义通用的抽象类作为基类,派生出具体的子类,可以提高代码的复用性,避免代码重复。
  • 在多态的环境下,使用抽象类和抽象方法定义统一的虚方法,可以让子类实现这些方法,减少繁琐的类型转换操作。
  • 抽象类和抽象方法的特点
  • 抽象类不能被实例化,只能用于派生具体类。
  • 抽象类可以包含抽象方法、虚方法、常规方法和属性。
  • 抽象方法必须在派生类中被实现,否则派生类也必须声明为抽象类。
  • 抽象方法必须被声明为public,因为派生类必须可以访问它。

2、抽象类的使用要求

  • abstract修饰符可用于类、方法、属性、索引和事件。
  • abstract修饰符用于简单地概括一个不完整的内容(摘要)。常用于基类,由派生类来继承实现基类的抽象属性和方法。
  • 抽象类是对具有相同行为和特征的抽象,抽象类中的成员不会指定具体细节,一般再其派生类中去实现具体内容。
  • 在普通类前加上abstract修饰符即可标注为抽象类。 如果一个普通类中对其成员使用了abstract修饰符,则该类必须修饰为抽象类。
  • 无法使用sealed修饰符来修改抽象类,因为两个修饰符的含义相反。sealed修饰符阻止类被继承,而abstract修饰符要求类被继承。
  • 继承抽象方法的派生类,必须实现override抽象类中的所有成员,用override重写来实现。
  • 抽象类无法被实例化,但可以让派生类实例化。
  • 抽象方法必须声明在抽象类中,声明抽象方法时,不能使用virtual、static、private修饰符。
  • 抽象方法声明不提供实际的声明,因此没有方法主体,和接口类似,和虚方法不一样。

3、抽象类和接口的区别

相同点:

1、不能实例化;

2、包含未实现的方法声明

3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)

不同点:

1、接口可以多继承,抽象类不能实现多继承。
2、接口只能定义抽象规则,抽象类既能定义抽象规则也能提供已实现的成员。
3、接口是一组行为规范,抽象类是一个不完全的类,着重于族的概念。
4、接口支持回调,抽象类不能实现回调,因为继承不支持。
5、接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法。
6、接口可以作用于值类型和引用类型,抽象类只能作用于引用类型(例如:Struct只能继承接口)。
7、抽象类应主要用于关系密切的对象,而接口则是适合为不相关的类提供通用功能。
8、接口着重于Can—Do关系类型,抽象类则偏重于IS—A式关系。
9、接口多定义对象的行为,抽象类多定义对象的属性。
10、如果要设计小而简练的功能块,则使用接口,如果要设计大的功能单元,则使用抽象类。
11、接口对应是面向对象编程思想的重要原则:面向接口编程。

4、抽象类的示例

public abstract class Shape
{public abstract double Area { get; }
}public class Square : Shape
{private double side;public Square(double s){side = s;}public override double Area{get { return side * side; }}
}

        abstract可以用来修饰类、方法、属性、索引器和事件,但不包括字段。使用abstract修饰的类,该类只能作为其他类的基类,不能实例化。而且abstract修饰的成员在派生类中必须全部实现,不允许部分实现,否则编译异常。 

        抽象类和抽象方法是C#编程中的两个重要概念,它们提供了面向对象编程的许多特性。通过抽象类和抽象方法,我们可以定义通用的属性和行为,然后让具体的子类来继承并实现它们。这样可以提高代码的复用性、可维护性和可扩展性,从而使我们的应用程序更加灵活和可维护。

二、virtual虚函数的用法

1、 虚函数的作用

        当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法,虚方法是使用关键字virtual声明的,虚方法可以在不同的继承类中有不同的实现,即为基类中定义的允许在派生类中重写的方法;

定义如下:

访问修饰符 virtual 函数返回类型 函数名(参数表) {函数体};
 class Person{public virtual void XXX()//虚方法{Console.WriteLine("我有一个梦想,那就是动身去往远方!!");}}class Boy : Person//继承person{public override void XXX()//虚方法调用{base.XXX();}}

        调用上,使用子类构造的对象调用虚方法,就会调用子类的方法,使用父类构造的对象,就会调用父类的方法;在基类中声明的虚方法一般在派生类中对其进行调用,会运用到base关键字:

2、虚函数的使用要求

1、 虚拟类其实指的是正常类中的虚拟方法,所以虚拟类可以直接使用实例,这是与抽象类不同的一点;

2、 虚拟方法是在方法前加virtual关键字,对方法进行声明,说明这个方法为虚方法;

3、虚拟函数和正常函数无区别;

4、子类继承虚拟类可以实现虚拟方法也可以不实现虚拟方法;

5、虚方法可以在不同的继承类中有不同的实现;

6、虚方法可以在不同的继承类中有不同的实现;

3、虚函数使用示例

public class Animal
{public virtual void Speak(){Console.WriteLine("Animal speaks.");}
}public class Dog : Animal
{public override void Speak(){Console.WriteLine("Dog barks.");}
}

1.允许 子类 / 派生类 进行重写;
2.增加代码的可维护性,脉络较清淅有条理;

三、override和new的使用

override 

  • override是派生类用来重写基类方法的。调用的派生类方法,如需调用基类方法用base关键字
  • override不能重写非虚方法或静态方法。
  • override重写必须用abstract、override、virtrual修饰的方法。

new

  • new 是派生类用来隐藏基类方法的,在派生类中看不到基类方法,但调用的还是基类的方法。
  • 如果在派生类中要隐藏基类方法而不用new关键字,编译时会出现一个警告,提示如果是要隐藏基类中的方法,请使用new关键字。
  • new可以隐藏基类中的普通方法也可以是虚方法。
  • 如果在派生类中用private来修饰new 方法,那么只在该派生类中隐藏了基类中的方法,在该派生类之外,相当于没有隐藏基类中的方法;
  • 如果在派生类中隐藏了基类中的方法,在该派生类的派生类中,将延续对该派生类对基类方法的隐藏。
  • new 隐藏虚方法,重新生成本类与基类中方法同名的方法

代码1: 

    public class Program{static void Main(string[] args){A a;B b = new B();C c = new C();b.Test();a = b;a.Test();a = c;a.Test();D d = new D();d.Test();Console.ReadLine();}}public class A{public virtual void Test(){Console.WriteLine("A Test()");}}public class B : A{public new void Test(){Console.WriteLine("B Test()");}}public class C : A{public override void Test(){Console.WriteLine("C Test()");}}public class D : C{public override void Test(){Console.WriteLine("D Test()");}}

代码2:

 public class Program{static void Main(string[] args){A a = new A();a.Test();B b = new B();b.Test();A c = new B();c.Test();A d = new C();d.Test();Console.ReadLine();}}public class A{public virtual void Test(){Console.WriteLine("A Test()");}}public class B : A{private new void Test(){Console.WriteLine("b Test()");}}public class C : B{public override void Test(){Console.WriteLine("C Test()");}}

 参考文献:

浅谈C#中的抽象类(abstract)和接口(interface)_c# 抽象类和接口-CSDN博客

C#抽象类和抽象方法详解_naer_chongya的博客-CSDN博客

C#中虚方法(virtual)详解_c# virtual-CSDN博客

C#中Abstract和Virtual-CSDN博客

C#基础知识四之override和new的区别-CSDN博客

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

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

相关文章

后端项目连接数据库-添加MyBatis依赖并检测是否成功

一.在pom.xml添加Mybatis相关依赖 在Spring Boot项目中&#xff0c;编译时会自动加载项目依赖&#xff0c;然后使用依赖包。 需要在根目录下pom.xml文件中添加Mybatis依赖项 <!-- Mybatis整合Spring Boot的依赖项 --> <dependency><groupId>org.mybatis.s…

JDK 21 虚拟线程相关知识简介

什么是虚拟线程 虚拟线程是一种轻量级线程&#xff0c;也可以称为协程。它是一种抽象的概念&#xff0c;可以理解为在程序中同时执行多个线程的并发执行。虚拟线程是由Java虚拟机&#xff08;JVM&#xff09;来实现的&#xff0c;它并不与特定的操作系统线程绑定&#xff0c;而…

UDP的特点及应用场景

目录 UDP特点 应用场景 总结 User Datagram Protocol&#xff08;UDP&#xff0c;用户数据报协议&#xff09;是互联网协议套件中的一种传输层协议。与TCP不同&#xff0c;UDP是一种无连接的、不可靠的协议。 UDP特点 要知道UDP可以用来做什么&#xff0c;首先我们要知道它…

UE Web Remote Control

前言 最近在研究UE自启WEB服务和网页通信以此来通过网页与UE进行数据交互&#xff0c;这样最好的方式就是可以摒弃掉整个繁琐的通信连接流程如TCP UDP&#xff0c;但是找到的一些方法都不是很适用&#xff0c;尤其是WEBUI这个插件它只适合内嵌到UE本身才能完成交互&#xff0c;…

LeetCode(37)矩阵置零【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 73. 矩阵置零 1.题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]…

仓储货架生产厂家|拥有编码器+激光传感器的海格里斯HEGERLS料箱式四向穿梭车

随着高新科技的迅猛发展&#xff0c;仓储物流行业已慢慢朝着无人化、自动化、智能化、密集化方向快速发展&#xff0c;用户的需求量也随之日益提升。在众多仓储物流设备中&#xff0c;四向穿梭车越来越得到各大中小企业所青睐和投入使用。四向穿梭车不但具有良好的可延性与适配…

2022年土地出让数据,超多字段,附数据可视化

分享一个土地出让数据&#xff0c;详细信息如下&#xff1a; 数据名称: 2022年土地出让数据 数据格式: Shp、excel 数据时间: 2022年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 部分字段如下&#xff1a; 如需获取可搜“吧唧数…

【面试心经】——上海广升智能科技有限公司

介绍 本文记录的是2018.5月份应聘上海广升linux 开发岗位的经历。 福利待遇&#xff1a; BOSS 岗位薪资&#xff1a;15K ~25K。 每月一天带薪病假或事假。 国家规定外有额外4天年假。 每年两次旅游&#xff0c;上半年国外&#xff0c;下半年国内。 每年两次调薪机会&…

get 请求获取最新缓存

// request拦截,在请求发起前搞事情 service.interceptors.request.use((config) > {const url config.urlif (config.method get) {url.indexOf(?) -1 ? config.url url ?_ (new Date().getTime()) : config.url url &_ (new Date().getTime())}if (getTok…

Ultipa参加国际科学会议KGSWC2023

近日&#xff0c;领先的国际科学会议 KGSWC 2023&#xff0c;在西班牙萨拉戈萨大学召开&#xff0c;Ultipa Graph参加。 KGSWC2023是第五届伊比利亚-美洲会议和第四届印度-美洲知识图谱与语义网大会的联合论坛。自2019年成立以来&#xff0c;KGSWC一直是一个重要的学术活动&am…

测试工程师核心软技能「情绪管理」

大家好呀&#xff0c;我是楼仔。 我之前经常提到一句话&#xff1a;大多数时候所谓的“技术之玻璃天花板”&#xff0c;其实只是缺乏软技能而已。 所以粉丝朋友们&#xff0c;我们除了需要关注技术&#xff0c;更需要注重软技能的提高。 关于软技能相关的文章&#xff0c;之…

婚恋小程序APP一站式开发搭建丨幸福全方位婚恋一线牵丨相亲交友婚恋小程序使用手册丨实名认证丨语音交友丨源码交付,支持二开丨同城交友

1: 如何在相亲交友婚恋小程序寻找属于自己的幸福 打开相亲交友婚恋小程序&#xff0c; 在首页遇到自己喜欢的人&#xff0c; 点击详情&#xff0c; 然后点击喜欢&#xff0c; 如果对方也喜欢你&#xff0c; 互相喜欢成功&#xff0c; 可以在缘分页看到对方的微信&#xff0c; 添…

基于YOLOv8深度学习的PCB板缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…

Android Studio Giraffe-2022.3.1-Patch-3安装注意事项

准备工作&#xff1a; android studio下载地址&#xff1a;https://developer.android.google.cn/studio/releases?hlzh-cn gradle下载地址&#xff1a;https://services.gradle.org/distributions/ 比较稳定的网络环境&#xff08;比较android studio相关的依赖需要从谷歌那边…

部分WiFi相关的术语

LAN&#xff1a;即局域网&#xff0c;是路由和主机组成的内部局域网&#xff0c;一般为有线网络。 WAN&#xff1a;即广域网&#xff0c;是外部一个更大的局域网。 WLAN&#xff08;Wireless LAN&#xff0c;即无线局域网&#xff09;&#xff1a;前面我们说过LAN是局域网&am…

Redis集群模式

Redis集群主要有三种模式 主从复制模式&#xff08;Master-Slave&#xff09;、哨兵模式&#xff08;Sentinel&#xff09;和Cluster模式 主从复制模式&#xff1a;适用于数据备份和读写分离场景&#xff0c;配置简单&#xff0c;但在主节点故障时需要手动切换。哨兵模式&…

Google分析中的基础概念

当提到Google分析时&#xff0c;我们通常指的是一种用于跟踪和分析网站和应用程序数据的工具。在使用Google分析之前&#xff0c;了解其基础概念对于正确配置和有效使用该工具非常重要。 1、帐户&#xff08;Account&#xff09;&#xff1a;帐户是Google分析中的最高层级。一…

【网络安全】-安全常见术语介绍

文章目录 介绍1. 防火墙&#xff08;Firewall&#xff09;定义通俗解释 2. 恶意软件&#xff08;Malware&#xff09;定义通俗解释 3. 加密&#xff08;Encryption&#xff09;定义通俗解释 4. 多因素认证&#xff08;Multi-Factor Authentication&#xff0c;MFA&#xff09;定…

WordPress 外链跳转插件

WordPress 外链跳转插件是本站开发的一款WordPress插件&#xff0c;能对文中外链添加一层过滤&#xff0c;有效防止追踪&#xff0c;以及提醒用户。 类似于知乎、CSDN打开其他链接的提示。 后台可以设置白名单 学习资料源代码&#xff1a;百度网盘 密码&#xff1a;123

【飞桨星河社区五周年线下工坊-杭州站】

? 欢迎大家参加杭州极客工坊&#xff0c;深入了解大模型前沿技术和创新应用&#xff0c;一站式体验AI原生应用开发? 精彩议程敬请期待&#xff5e; ? 时间&#xff1a;2023年12月3日 14:00-17:30 ? 地点&#xff1a;杭州西湖区花蒋路3号西溪润泽园度假酒店 ? 主题&#xf…