【C# 教程系列第 15 篇】抽象类与接口的区别
这是【C# 教程系列第 15 篇】,如果觉得有用的话,欢迎关注专栏。
前面几篇博客介绍了抽象类与接口,提到其中一个,很容易想到另外一个,包括搜索时自动联想的内容也是两者的区别,因为抽象类和接口在使用方法上很类似。
如果想简单看下两者区别的,这里我以 Excel 表格形式做了总结。
如果想深入了解两者区别的,可以看下方内容。
为方便理解,这里我再简述一下抽象类与接口。
抽象类:
抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;
重要的是抽象类可以包括抽象方法,这是普通类所不能的。
抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。
另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
接口:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。
除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。
相同点:
- 都可以被继承。
- 不能被实例化。
- 自身不提供实现代码。
- 派生类必须实现未实现的方法。
不同点:
- 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
- 接口可以被多重实现,抽象类只能被单一继承。
- 一个类一次可以实现若干个接口,但是只能扩展一个父类。
- 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法默认为非虚的,不过你也可以声明为虚的。
- 抽象类实现了 OOP 中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的交给子类去实现。
- 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其它方法,就叫接口污染。
下面我单独将 相同点 里的第三条(自身不提供实现代码)抽出来。因为这点对抽象类与接口来说并不完全相同。
//抽象类的定义
public abstract class Test
{public void DoWork(){Debug.Log("Working");}public abstract int Value { get; set; }
}
//接口的定义
public interface ITest
{void DoWork();int value { get; set; }
}
通过上面两段代码,我们会发现以下几点差异。
- 抽象类的成员定义是带有可访问性关键字的(例如:public),而接口是不带可访问性关键字的,因为接口中所声明的成员都是公共的(隐式public),所以没有必要添加访问修饰符。
- 抽象类除了包含抽象成员外,还可以包含非抽象成员,也包括构造函数、而接口不能包含具备实现代码的成员,也不能包含构造函数。因为接口是另一种类型,不是类,而抽象类是类的一种。
你的问题得到解决了吗?欢迎在评论区留言。
赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。
结束语
技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。
最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。
【C# 教程系列第 15 篇】抽象类与接口的区别相关推荐
- 【Mac 教程系列第 15 篇】如何查看 Mac 产品的序列号
这是[Mac 教程系列第 15 篇],如果觉得有用的话,欢迎关注专栏. 点击左上角的 logo 标志,选择关于本机,然后会弹出如下界面 你的问题得到解决了吗?欢迎在评论区留言. 赠人玫瑰,手有余香,如 ...
- 【Unity3D 教程系列第 15 篇】本地数据持久化之 Playerprefs 类
这是[Unity3D 教程系列第 15 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:什么是 PlayerPrefs 类 二:PlayerPrefs 类中的静态方法 1:写入数据 2:读取数据 ...
- 【IDEA 教程系列第 15 篇】idea 上下左右移动光标的快捷键
这是[IDEA 教程系列第 15 篇],如果觉得有用的话,欢迎关注专栏. 快捷键如下表格 功能 Windows Mac 光标上移 ↑ ↑ 或 Ctrl + P 光标下移 ↓ ↓ 或 Ctrl + N ...
- 【C# 教程系列第 11 篇】什么是抽象类、抽象方法
这是[C# 教程系列第 11 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:什么是抽象类.抽象方法 二:抽象类的特性 1:抽象类不能实例化 2:抽象类可以包含抽象方法和抽象访问器 3:不能用 ...
- 【C# 教程系列第 12 篇】抽象类的简单实现
这是[C# 教程系列第 12 篇],如果觉得有用的话,欢迎关注专栏. 上一篇博客讲到了 C# 中的抽象类与抽象方法,对这两个概念不清楚的可以 点击此处 通过上篇博客我们会发现,使用 abstract ...
- 【Mac 教程系列第 14 篇】如何设置 Mac 允许从任意来源下载 App
这是[Mac 教程系列第 14 篇],如果觉得有用的话,欢迎关注专栏. 本机系统版本 macOS Catalina 10.15.7 一:问题描述 在 系统偏好设置 - 安全性与隐私 中,"通 ...
- 【HTML 教程系列第 19 篇】HTML 表格中的行合并与列合并
这是[HTML 教程系列第 19 篇],如果觉得有用的话,欢迎关注专栏. 在使用 Excel 的时候,会经常的用到合并单元格,而在 HTML 的表格中,有时我们也需要将横向的多个单元格或者纵向的多个单 ...
- 【Mac 教程系列第 17 篇】如何找回 Mac 上访达侧边栏上的下载、文稿、隔空投送等文件夹选项
这是[Mac 教程系列第 17 篇],如果觉得有用的话,欢迎关注专栏. 一:问题描述 好久没写过关于 Mac 的博客了,也是因为平常没遇到过什么问题. 前几天准备 git clone 一个项目到[下载 ...
- 【HTML 教程系列第 18 篇】详解什么是 HTML 中的表格 table
这是[HTML 教程系列第 18 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:什么是 HTML 中的表格 1:表格中的行 tr.单元格 td 2:表格中的标题 caption 3:表格中的表 ...
最新文章
- electron node 版本不匹配的解决细节
- @async注解_SpringBoot中Async异步方法和定时任务介绍
- java 及时释放内存_JMM(一):初识Java内存模型
- P3600-随机数生成器【dp,数学期望】
- python单词什么意思_“逐字逐句”是什么意思?语法在Python中意味着什么?
- 一个HTTP请求,把网站打裂开了!
- 电脑怎么重装系统Win11?需要什么条件
- morphia查询Mongo数据库通过ReadPreference主从数据库查询切换方法
- SDN第六次上机作业
- Ubuntu系统最简GCC安装方法
- 闽教英语app 破解版 免费版
- html如何设置整体字体颜色,html字体颜色 html如何设置字体颜色
- U890采购入库单修改供应商
- 密码编码学与网络安全笔记(第7版)
- halcon之屌炸天的自标定(1)
- [5分钟学会Katana Katana中文教程]—摘要
- “修真院”修行九九八十一难(1)
- 微机原理与接口技术实验:子程序设计实验
- 关于系统架构你不知道的那些事-架构设计流程:评估和选择备选方案
- edge 错误 客户端和服务器不支持常用的 SSL 协议版本或密码套件