思维导航:

  • 前言

  • abstract修饰符

  • 抽象类与接口的异同

  • 抽象类和接口的使用

  • 总结

  • 参考资料

文章正文:

?回到顶部

前言:

  最近在研究.NET Core的一些类库源码的时候发现在底层类库中使用了大量的抽象类,然而发现自己搬砖这么多年好像从来没有在项目中使用抽象类或者抽象方法去实现某个功能模块,并且对修饰符Abstract概念也只懂得一些皮毛(也就是面试的时候会问下其基本作用)。当然,咱们不懂就要去慢慢的学习了解,不能让这些不懂的技术和知识点一直困扰着我们。接下来就让我们一起去探索C# Abstract修饰符的作用,并且了解在什么场景下我们会使用到抽象类,从而提升我们项目的健壮性。

?回到顶部

abstract修饰符:

基本概念:abstract修饰符指示要修改的东西有缺失或不完整的实现。

修饰范围:abstract修饰符可以用于修饰类、方法、属性、索引器(indexer)和事件。

抽象类:

 public abstract class HttpRequest{}

抽象方法:

//todo:抽象方法不能提供实际的实现,因此没有方法主体(并且抽象方法只能够在抽象类中声明)public abstract void ActionMethod();

抽象属性:

public abstract string ContentType { get; set; }

抽象索引器:

public string this[int index] => $"获取_{index}";

抽象事件:

//首先声明该事件的委托类型public delegate void BoilerLogHandler(string status);// 基于上面的委托定义事件public abstract event BoilerLogHandler BoilerEventLog;

?回到顶部

抽象类与接口的异同:

抽象类的用途:

是一个能够提供给多个派生类共享的通用基类。

接口的用途:

接口提供了派生类应遵循的标准结构。

抽象类的基本特征:

1、抽象类是特殊的类,除了不能实例化(只能通过实例化继承抽象方法的派生类来获取抽象类中的成员)外,具有类的其他特性(可以单继承)。
2、抽象类可以定义抽象方法,抽象方法没有现实。
3、继承抽象类的类必须把里面的抽象成员(成员包括:方法,属性,索引器,事件)全部重写(orveride),抽象类除外。

接口的基本特征:

1、接口无法直接进行实例化。

2、一个类或结构可以实现多个接口。

3、实现接口的任何类或结构都必须实现其所有成员。

4、接口包含的成员只有方法,属性,索引器(有参属性),事件四种成员。

5、接口不能包含实例字段、实例构造函数或终结器。

6、默认情况下,接口成员是公共的,不能有其他的修饰符。

抽象类和接口的区别:

相同:

1、都可以被继承

2、都不能直接被实例化

3、都可以包含方法声明且都没有实现

4、派生类必须实现未实现的成员

不同点:

1、接口可以被多重实现,抽象类只能被单一继承。

2、接口可以用于支持回调,继承并不具备这个特点。

3、抽象类可以定义字段、方法、属性、事件、索引器的实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。

4、接口中的成员访问类型默认为公共的,不能有其他的访问修饰符修饰。

5、定义的关键字不一样,抽象类需要使用abstract,而接口则使用interface。

?回到顶部

抽象类和接口的使用:

1、抽象类表共性(常应用在具有相同的行为和特征中),而接口则表规范(用于定义一种行为)。
2、抽象类主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
3、如果要设计大的功能单元,则使用抽象类;如果要设计小而简练的功能块,则使用接口。
4、如果预计要创建组件的多个版本,则创建抽象类。接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。
5、如果创建的功能将在大范围的全异对象间使用,则使用接口;如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。
6、分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”。为外部提供调用或功能需要扩充时优先使用接口。
7、好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。

具体实例如下:

实例一:就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。

实例二:比如说我们一个班级有很多为同学,这些同学都有着各自的特长,爱好,穿衣打扮的风格,因此我们减少代码冗余可以定义一个通用的学生抽象类用来描述学生的身高,体重,姓名,爱好,特征等相关特征和行为的公共抽象类。

实例三:我们需要创建 “狗”、“猫”、“鱼”、“马”这些对象(类),我们可以说他们有一些共同的属性像嘴巴、尾巴、重量、颜色、大小等等一些共同的属性(properties),但是它们彼此的属性的形状是不同的(如嘴巴),在这种情况下,我们如果一个个去定义各自类似的属性是不是比较繁琐?如果用抽象类是不是很方便的给他们去继承。抽象类也有个更加好的地方,体现在“同质异像”就是实质相同实现形式不同的方法继承上,例如上面的狗、猫、马等的呼吸这个方法或者跑的速度的方法形式不同,我们这个是用定义一个抽象方法,让他们各自的类去实现它是不是很方便。“抽象”的意义正在于此。将共同的东西抽出来封装,但不实现只给继承。

?回到顶部

总结:

  通过对抽象类的深入理解发现原来在程序设计方面需要考虑优化的问题还是有很多很多的,抽象类和接口的选择就是一个很典型的例子。往往我们会图简单而去直接定义接口使用,却往往忽视了后期的软件的健壮性和可拓展性。在以后的开发中需要多思考这方面的问题。最后假如文章有什么需要补充或者不足的地方希望大家指正,谢谢。

abstract类_走进C# abstract,了解抽象类与接口的异同相关推荐

  1. java final类的写法_重拾JavaSE基础——抽象类、接口、代码块、final和枚举

    今天继续回顾Java基础,有些东西用得不多,大家看看知道语法就好 主要内容 抽象类 抽象方法 抽象方法的写法 抽象方法是否可以私有化 抽象类的特征 抽象类有无构造器,能否实例化对象 抽象类的结构 抽象 ...

  2. 为什么派生的子类报错不能实例化抽象类_一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别...

    目录 #抽象类介绍 #为什么要用抽象类 #一个抽象类小故事 #一个抽象类小游戏 #接口介绍 #接口与类相似点: #接口与类的区别: #接口特性 #抽象类和接口的区别 #接口的使用: #接口最佳实践:设 ...

  3. java 接口是抽象类吗_我是如何理解Java抽象类和接口的

    在面试中我们经常被问到:Java中抽象类和接口的区别是什么?然后,我们就大说一通抽象类可以有方法,接口不能有实际的方法啦;一个类只能继承一个抽象类,却可以继承多个接口啦,balabala一大堆,就好像 ...

  4. 【JAVA系列】Java中的包、类的继承、多态、抽象类与接口

    文章目录 前言 一.包及访问权限 1.什么是包? 2.如何导入包? 3.JDK中常见的包 4.包的访问控制权限 二.继承 1.继承的基本概念 2.继承时方法调用顺序 3.super和this关键字 4 ...

  5. abstract类_「深入Java虚拟机」之二:Class类文件结构

    平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Java编译器可以把Java代码编译成存储字节码的Cla ...

  6. abstract类_【Java】类的结构 - Nemo

    类与对象 类中主要包括五种结构,下面进行对这五种结构进行详细的介绍. 1. 面向对象与面向过程 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做. 面向对象:强调具备了功能的对象,以类/对象为 ...

  7. idea 查看一个类的子类_Java-05-多态、抽象类、接口和内部类

    什么是多态 多态是指实例方法根据调用者会有不同的表现,就像多种形态一样.这里要注意的是:静态方法没有多态的说法. 可以看到,虽然都是 Person 类,但是 p1 是真正的 Person,而 p2 是 ...

  8. java编写车类_用Java程序创建一个汽车接口,接口中要定义汽车应有的属性和行为,随后编写多个汽车接口的实现类,...

    package No014.Final; //写出汽车的总接口:获得汽车名称和价格利用get方法: interface Car{ String getName(); int getPrince(); ...

  9. 抽象类和接口的异同(分点)

    相同点: 两者均有抽象方法(有继承/实现它的类具体实现) 均可以引用具体子类/实现类 两者都不能直接实例化 就是不能直接new一个抽象类/接口,因为没有实际意义啦 不同点: 抽象类用abstract修 ...

最新文章

  1. URLRewriter在ASP.NET配置文件中的用法
  2. 如何简单形象又有趣地讲解神经网络是什么?(知乎) 说的人很多,理解很充分_kebu12345678的博客-CSDN博客_神经网络知乎
  3. HYSBZ/BZOJ 1038 [ZJOI2008] 瞭望塔 - 计算几何
  4. ANSYS——对称模型对称边界的确定以及对称边界的约束施加问题
  5. 带界面的OCX制作实例
  6. 7-3 对整型数据排序 (15 分)
  7. bitherj java_比太钱包为什么从 Bitcoinj 切换到了 Bitherj ?比太钱包从 Bitcoinj 切换到了 Bitherj原因是什么?...
  8. win11 dev cpp程序关闭时弹出cmd错误0xc0000142的解决方法
  9. 中兴C93E全光网配置
  10. 浅谈电能质量在线监测装置的基本简介
  11. 局部连接层(Locally-Connected Layer)
  12. matlab roundn函数_columns函数的使用方法 matlab中round函数具体用法
  13. D35 Spark源代码(待补充)
  14. 计算机专业实习怎么找?大厂付费内推实习证明有用吗?
  15. linux系统sulog,Linux 下 Login 和 Logout 详解
  16. X64驱动:读取SSDT表基址
  17. GraphQL的探索之路 – SpringBoot集成GraphQL之Mutation篇四 - 第317篇
  18. css图片加内阴影不显示,css中实现图片阴影
  19. Roadstar.ai CEO 佟显乔:美团无人车配送是我们在降维场景下的一次商业化尝试
  20. 线上展厅平面图优势 广州商迪

热门文章

  1. HTML中的全局属性
  2. 负载测试与压力测试的区别
  3. 常见设备分辨率大小,响应式必备啊
  4. C#总结项目《影院售票系统》编写总结二
  5. sas宏中如何跳出%do循环
  6. VS2005 自动生成属性(转)
  7. 63个优秀测试网站地址【个人总结】
  8. 北大计算机学院 教授 湖南人,北大湘籍教授邹恒甫简历
  9. vue 判断页面加载完成_在Vue+webpack中详细讲解基础配置
  10. SpringMVC_1.认识MVC