这是【C# 教程系列第 15 篇】,如果觉得有用的话,欢迎关注专栏。

前面几篇博客介绍了抽象类与接口,提到其中一个,很容易想到另外一个,包括搜索时自动联想的内容也是两者的区别,因为抽象类和接口在使用方法上很类似。

如果想简单看下两者区别的,这里我以 Excel 表格形式做了总结。

如果想深入了解两者区别的,可以看下方内容。

为方便理解,这里我再简述一下抽象类与接口。

抽象类:

抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;

重要的是抽象类可以包括抽象方法,这是普通类所不能的。

抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。

另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

接口:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。

除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。

相同点:

  1. 都可以被继承。
  2. 不能被实例化。
  3. 自身不提供实现代码。
  4. 派生类必须实现未实现的方法。

不同点:

  1. 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
  2. 接口可以被多重实现,抽象类只能被单一继承。
  3. 一个类一次可以实现若干个接口,但是只能扩展一个父类。
  4. 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法默认为非虚的,不过你也可以声明为虚的。
  5. 抽象类实现了 OOP 中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的交给子类去实现。
  6. 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其它方法,就叫接口污染。

下面我单独将 相同点 里的第三条(自身不提供实现代码)抽出来。因为这点对抽象类与接口来说并不完全相同。

//抽象类的定义
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; }
}

通过上面两段代码,我们会发现以下几点差异。

  1. 抽象类的成员定义是带有可访问性关键字的(例如:public),而接口是不带可访问性关键字的,因为接口中所声明的成员都是公共的(隐式public),所以没有必要添加访问修饰符。
  2. 抽象类除了包含抽象成员外,还可以包含非抽象成员,也包括构造函数、而接口不能包含具备实现代码的成员,也不能包含构造函数。因为接口是另一种类型,不是类,而抽象类是类的一种。

你的问题得到解决了吗?欢迎在评论区留言。

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。


结束语

技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。

最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。

【C# 教程系列第 15 篇】抽象类与接口的区别相关推荐

  1. 【Mac 教程系列第 15 篇】如何查看 Mac 产品的序列号

    这是[Mac 教程系列第 15 篇],如果觉得有用的话,欢迎关注专栏. 点击左上角的 logo 标志,选择关于本机,然后会弹出如下界面 你的问题得到解决了吗?欢迎在评论区留言. 赠人玫瑰,手有余香,如 ...

  2. 【Unity3D 教程系列第 15 篇】本地数据持久化之 Playerprefs 类

    这是[Unity3D 教程系列第 15 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:什么是 PlayerPrefs 类 二:PlayerPrefs 类中的静态方法 1:写入数据 2:读取数据 ...

  3. 【IDEA 教程系列第 15 篇】idea 上下左右移动光标的快捷键

    这是[IDEA 教程系列第 15 篇],如果觉得有用的话,欢迎关注专栏. 快捷键如下表格 功能 Windows Mac 光标上移 ↑ ↑ 或 Ctrl + P 光标下移 ↓ ↓ 或 Ctrl + N ...

  4. 【C# 教程系列第 11 篇】什么是抽象类、抽象方法

    这是[C# 教程系列第 11 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:什么是抽象类.抽象方法 二:抽象类的特性 1:抽象类不能实例化 2:抽象类可以包含抽象方法和抽象访问器 3:不能用 ...

  5. 【C# 教程系列第 12 篇】抽象类的简单实现

    这是[C# 教程系列第 12 篇],如果觉得有用的话,欢迎关注专栏. 上一篇博客讲到了 C# 中的抽象类与抽象方法,对这两个概念不清楚的可以 点击此处 通过上篇博客我们会发现,使用 abstract ...

  6. 【Mac 教程系列第 14 篇】如何设置 Mac 允许从任意来源下载 App

    这是[Mac 教程系列第 14 篇],如果觉得有用的话,欢迎关注专栏. 本机系统版本 macOS Catalina 10.15.7 一:问题描述 在 系统偏好设置 - 安全性与隐私 中,"通 ...

  7. 【HTML 教程系列第 19 篇】HTML 表格中的行合并与列合并

    这是[HTML 教程系列第 19 篇],如果觉得有用的话,欢迎关注专栏. 在使用 Excel 的时候,会经常的用到合并单元格,而在 HTML 的表格中,有时我们也需要将横向的多个单元格或者纵向的多个单 ...

  8. 【Mac 教程系列第 17 篇】如何找回 Mac 上访达侧边栏上的下载、文稿、隔空投送等文件夹选项

    这是[Mac 教程系列第 17 篇],如果觉得有用的话,欢迎关注专栏. 一:问题描述 好久没写过关于 Mac 的博客了,也是因为平常没遇到过什么问题. 前几天准备 git clone 一个项目到[下载 ...

  9. 【HTML 教程系列第 18 篇】详解什么是 HTML 中的表格 table

    这是[HTML 教程系列第 18 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:什么是 HTML 中的表格 1:表格中的行 tr.单元格 td 2:表格中的标题 caption 3:表格中的表 ...

最新文章

  1. electron node 版本不匹配的解决细节
  2. @async注解_SpringBoot中Async异步方法和定时任务介绍
  3. java 及时释放内存_JMM(一):初识Java内存模型
  4. P3600-随机数生成器【dp,数学期望】
  5. python单词什么意思_“逐字逐句”是什么意思?语法在Python中意味着什么?
  6. 一个HTTP请求,把网站打裂开了!
  7. 电脑怎么重装系统Win11?需要什么条件
  8. morphia查询Mongo数据库通过ReadPreference主从数据库查询切换方法
  9. SDN第六次上机作业
  10. Ubuntu系统最简GCC安装方法
  11. 闽教英语app 破解版 免费版
  12. html如何设置整体字体颜色,html字体颜色 html如何设置字体颜色
  13. U890采购入库单修改供应商
  14. 密码编码学与网络安全笔记(第7版)
  15. halcon之屌炸天的自标定(1)
  16. [5分钟学会Katana Katana中文教程]—摘要
  17. “修真院”修行九九八十一难(1)
  18. 微机原理与接口技术实验:子程序设计实验
  19. 关于系统架构你不知道的那些事-架构设计流程:评估和选择备选方案
  20. edge 错误 客户端和服务器不支持常用的 SSL 协议版本或密码套件

热门文章

  1. Java 基础语法7
  2. Python 抓取知识星球内容生成词云并生成 PDF
  3. max-width min-width max-height min-height
  4. 英语四六级作文和翻译
  5. 行车记录仪改家用监控求助
  6. 【计算机组成原理】计算机系统概述总结——基本知识要点汇总
  7. linux进程概念(中)
  8. 从技术实现角度看信贷ABS业务(一)
  9. intel e1000 网卡 napi分析
  10. 143-再谈mtx和lock_guard和unique_lock