本人近日面试遇到此等问题。然后又一次补习了一下下。希望对同行们有所帮助。

一、抽象类:

      抽象类是特殊的类,仅仅是不能被实例化;除此以外。具有类的其它特性;重要的是抽象类能够包括抽象方法,这是普通类所不能的。抽象方法仅仅能声明于抽象类中,且不包括不论什么实现。派生类必须覆盖它们。

另外,抽象类能够派生自一个抽象类,能够覆盖基类的抽象方法也能够不覆盖,假设不覆盖。则其派生类必须覆盖它们。

       二、接口:

      接口是引用类型的,类似于类,和抽象类的相似之处有三点:

       1、不能实例化;

       2、包括未实现的方法声明;

       3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是全部成员(不仅是方法包含其它成员);
       另外。接口有例如以下特性:

接口除了能够包括方法之外,还能够包括属性、索引器、事件,并且这些成员都被定义为公有的。

除此之外,不能包括不论什么其它的成员。比如:常量、域、构造函数、析构函数、静态成员。一个类能够直接继承多个接口,但仅仅能直接继承一个类(包括抽象类)。

      三、抽象类和接口的差别:

      1.类是对对象的抽象,能够把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口仅仅是一个行为的规范或规定,微软的自己定义接口总是后带able字段,证明其是表述一类类“我能做。

。。”.抽象类很多其它的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中.

      2.接口基本上不具备继承的不论什么详细特点,它只承诺了可以调用的方法;    

      3.一个类一次能够实现若干个接口,可是仅仅能扩展一个父类    

      4.接口能够用于支持回调,而继承并不具备这个特点.    

      5.抽象类不能被密封。

6.抽象类实现的详细方法默觉得虚的,但实现接口的类中的接口方法却默觉得非虚的,当然您也能够声明为虚的.

      7.(接口)与非抽象类类似。抽象类也必须为在该类的基类列表中列出的接口的全部成员提供它自己的实现。可是。同意抽象类将接口方法映射到抽象方法上。  

      8.抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的。而把可变的座位子类去实现。  

      9.好的接口定义应该是具有专一功能性的。而不是多功能的,否则造成接口污染。假设一个类仅仅是实现了这个接口的中一个功能,而不得不去实现接口中的其它方法。就叫接口污染。  

     10.尽量避免使用继承来实现组建功能,而是使用黑箱复用。即对象组合。由于继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们所有载入到栈中!后果可想而知.(结合堆栈原理理解)。同一时候。有心的朋友能够留意到微软在构建一个类时,非常多时候用到了对象组合的方法。

比方asp.net中,Page类,有Server Request等属性。但事实上他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常主要的一个设计原则。

11.假设抽象类实现接口。则能够把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法.

  

      四、抽象类和接口的使用:

      1. 假设估计要创建组件的多个版本号,则创建抽象类。抽象类提供简单的方法来控制组件版本号。

2.假设创建的功能将在大范围的全异对象间使用。则使用接口。假设要设计小而简练的功能块,则使用接口。

3.假设要设计大的功能单元。则使用抽象类.假设要在组件的全部实现间提供通用的已实现功能,则使用抽象类。  

      4.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

 下面是我在网上看到的几个形象比喻,真的很不错,呵呵:

 

   1>飞机会飞。鸟会飞,他们都继承了同一个接口“飞”。可是F22属于飞机抽象类,鸽子属于鸟抽象类。

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

抽象类和接口有什么差别?
简单来说,

接口是公开的。里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是能够有私有方法或私有变量的.
另外。实现接口的一定要实现接口里定义的全部方法,而实现抽象类能够有选择地重写须要用到的方法。一般的应用里,最顶级的是接口,然后是抽象类实现接口。最后才到详细类实现。
还有,接口能够实现多重继承。而一个类仅仅能继承一个超类,但能够通过继承多个接口实现多重继承。接口还有标识(里面没有不论什么方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.
 
接口和抽象类的差别,我认为主要是两点,一个是抽象类里还能够有非抽象的方法,尽管抽象类仍无法实例化。可是其子类能够。也就是说这些非抽象函数仍能够被多态调用。这也是抽象类为什么没有全然被接口代替的原因。接口就是相反了。只是接口也有一个优势是抽象类无法比拟。就是类能够继承多个接口。而抽象类和普通类一样,仅仅能继承一个。所以接口能够解决多重继承问题。
 
抽象类能够仅仅实现部分方法,接口则必须实现其所有方法。抽象类的方法能够有抽象方法,也能够有普通方法。接口里的方法必须是抽象方法。抽象类的方法的訪问权限能够多种,接口的方法的訪问权限仅仅能是public;抽象类的子类仅仅能继承一个抽象类,而实现接口的类能够同一时候实现多个接口.


笼统点说:

接口 = 定义了要做的全部事情。但自己啥也不干

抽象类 = 做了部分共做,剩下的他不干了,等后来人继续完毕
这就是差别!



抽象类的成员能够具有訪问级别,而接口的成员所有public级别

抽象类能够包括字段,而接口不能够,

抽象类能够继承接口,而接口不能继承抽象类

抽象类的成员能够具有详细实现,而接口不行

抽象的子类能够选择性实现其基类的抽象方法,而接口的子类必须所有实现
 

转自:http://www.360doc.com/content/10/0525/16/1039473_29458325.shtml

C#面试:抽象类与接口的更多相关文章

  1. 面试问题 - C# 接口和抽象类的区别

    这个问题基本上可以说是 面试时的必问问题 C# 中的接口和抽象类 相同点: 1. 都不能直接实例化,都可以通过继承实现其抽象方法 2. 都是面向抽象编程的技术基础,实现了诸多的设计模式 不同点: 1. ...

  2. java面试记录一:跳表、判断二叉树相同、冒泡排序、cookie和session的区别、设计模式(单例、工厂、模板方法、原型、代理、策略)、抽象类与接口的区别

    1.什么是跳表? 跳表实际上就是多层链表 跳表可用在让链表的元素查询接近线性时间 代码结构及java实现参考博客园随笔 2.判断两棵二叉树是否相同?(结构相同,内容相同) 思路:(1)先定义树节点Tr ...

  3. Java中多态、抽象类和接口

    1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...

  4. 抽象类和接口 static final finalize

    抽象类 任何含有一个或多个抽象方法的类都必须声明成抽象类,用关键字abstract. 抽象类没有对象,即一个抽象类不能用new来直接实例化. 不能定义抽象构造方法或抽象静态方法.(但是可以创建父类引用 ...

  5. 我是如何理解Java抽象类和接口的

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

  6. JAVA抽象类和接口的深入探讨

    Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的. ...

  7. java基础之抽象类与接口的区别

    在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...

  8. php抽象类和接口的区别

    php抽象类和接口的区别 tags:抽象类 接口 抽象类和接口 php 引言:这是一个面试经常被问到的问题,也是一个经典问题.我们尽量引用官方权威的说明或者经过实验来证明本文所说的内容准确性. 抽象类 ...

  9. java详解final、多态、抽象类、接口原理

    1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...

随机推荐

  1. Dorado日常使用总结

    1.360兼容模式下的控件虚线边框问题: 控件加载是onReady事件中加上:self.focusable=false;(用于指示该种控件是否支持获得控制焦点.) 2.360兼容模式下滚动条 cont ...

  2. 实例对比 Julia, R, Python,谁是狼语言?

    对于一个平台来说,使用者对技术本身是不敏感的,所以我们需要增加一些限制来减少集群的一些不可控情况,例如不断的写入新表/新数据却不记得删除,大量不按规范创建的表名等情况.与此同时应尽量让技术对用户透明, ...

  3. POJ3683 Priest John's Busiest Day 【2-sat】

    题目 John is the only priest in his town. September 1st is the John's busiest day in a year because th ...

  4. linux系统程序设计教程

    linux系统程序设计教程 第一章:生成一个Process(进程) 进程是什么?简单地说,进程就是在执行状态下的一个程序(包括CPU状态,所占内存的状态,等等) A进程生成了B进程,也就是说,A程序在 ...

  5. 编程风格——代码中特殊的注释技术——TODO、FIXME和XXX的用处

    代码中特殊的注释技术——TODO.FIXME和XXX的用处 前言:今天在阅读Qt Creator的源代码时,发现一些注释中有FIXME英文单词,用英文词典居然查不到其意义!实际上,在阅读一些开源代码时 ...

  6. Python之文件操作:文件的读写

    一.open函数:对文件读写之前,需要先打开文件,获取文件句柄 注意:open() file() 尽量使用open(),Python3以后不支持file()了 1.open(file_name[,ac ...

  7. Python之数据结构:字典

    key值需要是不可变对象,字典没有顺序 1.声明一个字典 dictA={ } 2.字典添加元素 dictA['name']='jack' dictA['age']=19 dictA['sex']='m ...

  8. 51 Nod 1678 lyk与gcd

    1678 lyk与gcd 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 这天,lyk又和gcd杠上了.它拥有一个n个数的数列,它想实现两种操作. 1:将  ai  ...

  9. 处理printf的变参问题

    VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include <stdarg.h> (1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针: (2)然 ...

  10. linux创建和查看用户命令

    1.创建一个叫做hadoop的用户,用户的目录是/home/hadoop useradd -d /home/hadoop hadoop 2.输入密码 passwd hadoop 3.删除用户 user ...