转自:https://mp.weixin.qq.com/s?src=11&timestamp=1618912505&ver=3020&signature=YPxVz675i0IZ2-8xyhCXGX3sjYgjlaGqQGrYJiznnyD4*unzhIYmFT5Jozg5tFHCB*DpwKAKHIcihaqgXRHP*4bi8MVMTa178m82bQUZT9nDZl7CQP3hhZYyVu8drrnJ&new=1

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),但是它们彼此的属性的形状是不同的(如嘴巴),在这种情况下,我们如果一个个去定义各自类似的属性是不是比较繁琐?如果用抽象类是不是很方便的给他们去继承。抽象类也有个更加好的地方,体现在“同质异像”就是实质相同实现形式不同的方法继承上,例如上面的狗、猫、马等的呼吸这个方法或者跑的速度的方法形式不同,我们这个是用定义一个抽象方法,让他们各自的类去实现它是不是很方便。“抽象”的意义正在于此。将共同的东西抽出来封装,但不实现只给继承。

总结:

通过对抽象类的深入理解发现原来在程序设计方面需要考虑优化的问题还是有很多很多的,抽象类和接口的选择就是一个很典型的例子。往往我们会图简单而去直接定义接口使用,却往往忽视了后期的软件的健壮性和可拓展性。在以后的开发中需要多思考这方面的问题。

参考资料:

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members

https://blog.csdn.net/lizhenxiqnmlgb/article/details/82346478

https://kb.cnblogs.com/page/41836/

作者:追逐时光者

出处:https://www.cnblogs.com/Can-daydayup/p/13676586.html

C# 抽象类与接口异同相关推荐

  1. abstract类_走进C# abstract,了解抽象类与接口的异同

    思维导航: 前言 abstract修饰符 抽象类与接口的异同 抽象类和接口的使用 总结 参考资料 文章正文: ?回到顶部 前言: 最近在研究.NET Core的一些类库源码的时候发现在底层类库中使用了 ...

  2. 抽象类与接口有什么异同?

    抽象类与接口有什么异同? 什么是抽象类呢? 如果一个类中包含了抽象方法,那么这个类就是抽象类.可通过类或者方法中是否有abstract来判断,(abstain只能修饰类或者方法,不能修饰属性). 那什 ...

  3. 抽象类和接口的特点和异同

    抽象类 关键字:abstract:抽象 可以修饰类:叫做抽象类 可以修饰方法:叫做抽象方法,没有方法体,需要使用分号表示声明结束,抽象方法所在的类必须是抽象类 子类必须重写父类的抽象方法,除非子类也是 ...

  4. 类、抽象类、接口之间的区别

    目录 1.类与抽象类的异同之处 (1)类和抽象类的区别 (2)类和抽象类的相同之处 2.接口与类的异同之处 (1)接口与类相似点 (2)接口与类的区别 (3)接口特性 3.抽象类和接口的区别 1.类与 ...

  5. 抽象类和接口类的区别

    2019独角兽企业重金招聘Python工程师标准>>> 一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类 ...

  6. jdk8 接口抽象类区别_JDK 8时代的抽象类与接口

    jdk8 接口抽象类区别 在新的Java 8日期和时间API:Stephen Colebourne的访谈中 , Stephen Colebourne告诉Hartmut Schlosser :" ...

  7. JDK 8时代的抽象类与接口

    在新的Java 8日期和时间API:Stephen Colebourne的访谈中 , Stephen Colebourne告诉Hartmut Schlosser :"我认为最重要的语言更改不 ...

  8. [和管子对话] 2 2007-4-6/抽象类和接口的谁是谁非

    发布日期:2007.4.6 作者:Anytao ©2007 Anytao.com 转贴请注明出处,留此信息. 本文将介绍以下内容: • .NET的基础和技巧探讨 • 胡言乱语话技术 王论: 今日话题: ...

  9. C#自学42一抽象类和接口

    什么是抽象类.接口.普通类呢? 抽象类:在编程语句中,把用abstract关键字修饰的类称为抽象类.抽象类是不完整的,只能作为基类.一般用来进行类型隐藏和充当全局变量的角色. 接口:声明时用inter ...

最新文章

  1. 非x面容解锁插件ios13_ios13近期消息汇总,苹果要放大招??
  2. javascript的垃圾回收机制
  3. Matlab实现线性回归和逻辑回归: Linear Regression Logistic Regression
  4. tp5.0行为的用法,可以存入json数据,方便读取数据。
  5. Redis的基础事务
  6. 图解Http学习第三章
  7. [JS进阶] HTML5 之文件操作(file)
  8. 【原创】Mapped Statements collection does not contain value for DaoImpl.method
  9. Eclipse ADT Bundle 整合包下载地址(百度网盘)
  10. 3串锂电池充电保护板设计
  11. 让css的字体加粗后不影响宽度变化与content和attr()问题
  12. 视频图像协议接口大全
  13. 80多款装机必备软件,一次搞定
  14. iOS6的控制屏幕旋转技巧
  15. 输入文字时自动带空格解决办法
  16. MacOS打印自定义尺寸配置教程
  17. STM32MP157开发板调试笔记
  18. matlab求解非线性常微分方程组,求一道用matlab编程解非线性方程组
  19. android手机通讯录格式转换,手机通讯录小技巧,安卓手机通讯录转iPhone并不难,换机必学...
  20. MDT2008部署杂谈2——简介

热门文章

  1. python编程入门书-最适合Python初学者的6本书籍推荐「必须收藏」
  2. 二叉树的构造以及基本操作
  3. oracle如何删除一个用户下的所有数据?
  4. 将exe和dll文件打包成单一的启动文件
  5. 微信小程序中简单使用echarts图表
  6. c语言的字符数组strlen的详细使用
  7. SVN 将代码回滚到之前的版本的方法
  8. 全球最牛掰的 14 位大神,你知道几个??
  9. 蓝鲸智云5.1版本安装部署(完整版)
  10. 【第11天】SQL进阶-索引的创建、删除(SQL 小虚竹)