C#面试:抽象类与接口

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


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

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

       二、接口:
      接口是引用类型的,类似于类,和抽象类的相似之处有三点:
       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


posted @ 2017-05-05 21:05  clnchanpin  阅读(504)  评论(0编辑  收藏  举报