本人近日面试遇到此等问题。然后又一次补习了一下下。希望对同行们有所帮助。
一、抽象类: 抽象类是特殊的类,仅仅是不能被实例化;除此以外。具有类的其它特性;重要的是抽象类能够包括抽象方法,这是普通类所不能的。抽象方法仅仅能声明于抽象类中,且不包括不论什么实现。派生类必须覆盖它们。 另外,抽象类能够派生自一个抽象类,能够覆盖基类的抽象方法也能够不覆盖,假设不覆盖。则其派生类必须覆盖它们。 二、接口: 接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1、不能实例化; 2、包括未实现的方法声明; 3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是全部成员(不仅是方法包含其它成员); 另外。接口有例如以下特性: 接口除了能够包括方法之外,还能够包括属性、索引器、事件,并且这些成员都被定义为公有的。 除此之外,不能包括不论什么其它的成员。比如:常量、域、构造函数、析构函数、静态成员。一个类能够直接继承多个接口,但仅仅能直接继承一个类(包括抽象类)。 三、抽象类和接口的差别: 1.类是对对象的抽象,能够把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口仅仅是一个行为的规范或规定,微软的自己定义接口总是后带able字段,证明其是表述一类类“我能做。 。。”.抽象类很多其它的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中. 6.抽象类实现的详细方法默觉得虚的,但实现接口的类中的接口方法却默觉得非虚的,当然您也能够声明为虚的. 比方asp.net中,Page类,有Server Request等属性。但事实上他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常主要的一个设计原则。 11.假设抽象类实现接口。则能够把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法. 2.假设创建的功能将在大范围的全异对象间使用。则使用接口。假设要设计小而简练的功能块,则使用接口。 3.假设要设计大的功能单元。则使用抽象类.假设要在组件的全部实现间提供通用的已实现功能,则使用抽象类。 下面是我在网上看到的几个形象比喻,真的很不错,呵呵: 1>飞机会飞。鸟会飞,他们都继承了同一个接口“飞”。可是F22属于飞机抽象类,鸽子属于鸟抽象类。 2> 就像铁门木门都是门(抽象类)。你想要个门我给不了(不能实例化),但我能够给你个详细的铁门或木门(多态);并且仅仅能是门,你不能说它是窗(单继承);一个门能够有锁(接口)也能够有门铃(多实现)。门(抽象类)定义了你是什么。接口(锁)规定了你能做什么(一个接口最好仅仅能做一件事。你不能要求锁也能发出声音吧(接口污染))。 抽象类和接口有什么差别? 简单来说, 接口是公开的。里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是能够有私有方法或私有变量的. 另外。实现接口的一定要实现接口里定义的全部方法,而实现抽象类能够有选择地重写须要用到的方法。一般的应用里,最顶级的是接口,然后是抽象类实现接口。最后才到详细类实现。 还有,接口能够实现多重继承。而一个类仅仅能继承一个超类,但能够通过继承多个接口实现多重继承。接口还有标识(里面没有不论什么方法,如Remote接口)和数据共享(里面的变量全是常量)的作用. 接口和抽象类的差别,我认为主要是两点,一个是抽象类里还能够有非抽象的方法,尽管抽象类仍无法实例化。可是其子类能够。也就是说这些非抽象函数仍能够被多态调用。这也是抽象类为什么没有全然被接口代替的原因。接口就是相反了。只是接口也有一个优势是抽象类无法比拟。就是类能够继承多个接口。而抽象类和普通类一样,仅仅能继承一个。所以接口能够解决多重继承问题。 抽象类能够仅仅实现部分方法,接口则必须实现其所有方法。抽象类的方法能够有抽象方法,也能够有普通方法。接口里的方法必须是抽象方法。抽象类的方法的訪问权限能够多种,接口的方法的訪问权限仅仅能是public;抽象类的子类仅仅能继承一个抽象类,而实现接口的类能够同一时候实现多个接口. 笼统点说: 接口 = 定义了要做的全部事情。但自己啥也不干 抽象类 = 做了部分共做,剩下的他不干了,等后来人继续完毕 这就是差别! 抽象类的成员能够具有訪问级别,而接口的成员所有public级别 抽象类能够包括字段,而接口不能够, 抽象类能够继承接口,而接口不能继承抽象类 抽象类的成员能够具有详细实现,而接口不行 抽象的子类能够选择性实现其基类的抽象方法,而接口的子类必须所有实现 |
转自:http://www.360doc.com/content/10/0525/16/1039473_29458325.shtml