C#中的抽象类与接口有些相似,初学者很容易混淆,今天就让我来谈谈对二者的理解。

首先我们得明确二者的含义,分述如下:

如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类(abstract class),它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由override关键字来实现。

接口(interface)用来定义一种程序的协定。它是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。

抽象类与接口的相同点:

1.都可以被继承。
2.都不能被实例化。
3.都可以包含方法声明。
4.派生类必须实现未实现的方法。

抽象类与接口的不同点:

1.接口支持多继承;抽象类不能实现多继承(单根性)。即一个类一次可以实现若干个接口,但是只能继承一个父类。

2.接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。

3.接口是一组行为规范;抽象类是一个不完整的类,侧重族群的概念。

4.接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。

5.接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。

6.接口多定义对象的行为,着重于CAN-DO关系类型;抽象类多定义对象的属性,偏重于IS-A式的关系。

7.抽象类实现的具体方法默认为虚的;实现接口的类中的接口方法却默认为非虚的,当然也可以声明为虚的。

接口与抽象类有这么多相似的地方是一个巧合吗?不,其实从反编译工具可以看到接口是抽象类,抽象的不能实例化,只能被实现。接口是一个类,说明它也是一种数据类型,可以通过接口创建出接口对象(所谓的接口对象其实是实现该接口的类的对象),这就是接口的本质。

知道了抽象类和接口的区别,也了解了接口的本质,那怎么更好地去使用它们呢?简单地说,抽象类主要用于关系密切的对象,而接口用于为不相关的类提供通用功能。我打个通俗的比方吧,人会吃饭,狗也会吃饭,他们都继承了同一个接口“吃饭”,但是程序员属于人类,哈巴狗属于狗类,人和狗是不同的物种,是不相关的类型,但是因为实现了相同的接口“吃饭”因而都会吃饭。程序员是人,哈巴狗是狗,子类与其父类关系密切因而可以通过继承复用原有属性。给你个“人”的概念你不可能知道是什么样的人,给你个“狗”的概念你也不可能知道是什么狗,在这里人和狗就是抽象类的概念,因为是抽象的,所以不能实例化,只有通过子类继承后,实现了父类未实现的方法,才能实例化,也就才知道原来这个人是个程序员,那条狗是条哈巴狗。

当然理解只是对其本质的一种把握,在编程实践中还有很多需要注意的地方,这还有待学习,希望能够与读者一起不断进步。

浅谈我对C#中抽象类与接口的理解的更多相关文章

  1. 浅谈ASP.NET Core中IOC与DI的理解和使用

    说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生,早前,自己也有尝试过去了解这两个东西,但是一直觉得有点很难去理解,总觉得对其还是模糊不清,所以,趁着今天有空,就去把两个概念 ...

  2. 浅谈线程池(中):独立线程池的作用及IO线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...

  3. 【ASP.NET MVC系列】浅谈NuGet在VS中的运用

    一     概述 在我们讲解NuGet前,我们先来看看一个例子. 1.例子: 假设现在开发一套系统,其中前端框架我们选择Bootstrap,由于选择Bootstrap作为前端框架,因此,在项目中,我们 ...

  4. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  5. 浅谈如何检查Linux中开放端口列表

    给大家分享一篇关于如何检查Linux中的开放端口列表的详细介绍,首先如果你想检查远程Linux系统上的端口是否打开请点击链接浏览.如果你想检查多个远程Linux系统上的端口是否打开请点击链接浏览.如果 ...

  6. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  7. C#中抽象类和接口的区别

    原文:C#中抽象类和接口的区别 大家在编程时都容易把抽象类和接口搞混,下面为大家从概念上讲解抽象类和接口的区别: 一.抽象类: 含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是 ...

  8. 关于JAVA中抽象类和接口的区别辨析

    今天主要整理一下新学习的有关于Java中抽象类和接口的相关知识和个人理解. 1 抽象类 用来描述事物的一般状态和行为,然后在其子类中去实现这些状态和行为.也就是说,抽象类中的方法,需要在子类中进行重写 ...

  9. java 8中抽象类与接口的异同

    1.java 8中抽象类与接口的异同 相同点: 1)都是抽象类型: 2)都可以有实现方法(以前接口不行): 3)都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实 ...

随机推荐

  1. Day5-python基础之函数(二)

    生成器 迭代器 装饰器 模块   来个需求,一个列表中所有元素都+1 1.最容易想到的方法 for循环,找列表索引,对应每个值+1 list_old = [1,2,3,4,5,6,7,8,9] for ...

  2. 网站引入了css样式文件能访问,就是没有效果

    今天后端的同事遇到这么个问题,引入了外部css文件也能访问,就是页面上没有效果. 大概是下面这个样子: css引入如下: 我非常的纳闷,说真的我还没遇到过这种情况,UI是可以运行的,一点事都没有... ...

  3. Kinect 总结---Kinect基本认识

    玩了Kinect也有差不多一年的时间了,觉得Kinect是个挺好玩挺有未来的玩意.但是很经常做完了一次,下次又得重新看源码,没有把Kinect里的知识总结起来变为自己的知识,所以特意重新总结一下自己使 ...

  4. java内存泄漏的几种情况

    转载于http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静态 ...

  5. Linux下安装 MySQL

    Ubuntu环境 使用二进制安装包安装,相对简单绿色 1.到官网下载二进制压缩包http://dev.mysql.com/downloads/mysql/ 2.选择需要的版本 目前最新为5.7.之后选 ...

  6. [asp.net core]定义Tag Helpers

    原文地址 https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/authoring Getting started wi ...

  7. 关于JSF中immediate属性的总结(二)

    The immediate attribute in JSF is commonly misunderstood. If you don't believe me, check out Stack O ...

  8. 一个php 字符串判断问题

    先看代码 你觉得下面的代码会输出什么结果: <?php $a = "10"; $b = "1e1"; if($a == $b ) { echo " ...

  9. 5种 JavaScript 调用函数的方法

    一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正理解Javascript函数是如何工作而导致的(顺便说一下,许多那样的代码是我写的).JavaScript拥有函数式编程的特性 ...

  10. Javascript设计模式学习二(单例)

    定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点 普通的单例模式: 使用一个变量来标记当前是否已经为某个类创建过对象,如果是的话,在下一次获取该类的实例时,直接返回之前创建的对象.比如:使用 ...