抽象类和接口精华
抽象类相关
抽象类:又叫抽象基类:在定义的时候使用 abstract 关键字标记的普通类。他可包含一般类所包含的所具有的特性,例如字段,属性,方法,另外还包含一个很特殊的方法,叫抽象方法(没有实现的方法,而派生于该类的类就必须实现该方法),而且不能被实例化,主要用在类的定义和部分实现等方面。
接下来我们先看下抽象类和抽象方法在使用需要注意的地方:
1,抽象类需要用abstract关键字标记
2,抽象方法不能有任何的方法实现(连{}都不能有)
3,抽象成员必须包含在(隶属于)抽象类中。
4,由于抽象成员没有任何实现,所以子类必须将抽象成员重写。
5.抽象类不能实例化,所以抽象类的存在就是为了让子类继承。
6,抽象类中既可以包括抽象成员,也可以包括具有代码实现的成员。,
7,抽象方法不能用static修饰。
看过了抽象类和抽象方法后,我们接着来看下与接口相关的内容
接口相关:
接口:接口是一种特殊的抽象类,用interface关键字来标记接口类型,它可以包含实例/静态方法,任何实现该接口的类就必须按照接口的定义实现这些方法。
下面我们来看下使用接口要注意哪些地方:
1, 接口是一种规范,为了实现多态而存在
2, 接口不能被实例化
3, 接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,不能修改(默认为public)
4, 接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)
5, 接口中只能有方法、属性、所引器和事件,不能有“字段”
6, 接口与接口之间可以继承,并且可以多继承
7, 实现接口的子类必须实现该接口的全部成员。
8, 一个类可以同时继承一个类并实现多个接口,如果一个类同时继承了父类A,并且实现了接口IA,那么语法上A必须写在IA的前面。Class Test:A,IA{},因为类是单继承的。
9, 当一个抽象类实现接口的时候,如果不想把接口中的成员实现,可以把该成员实现为abstract
10, 显示实现接口,只能通过接口变量来调用(因为显示实现接口后成员为private)
看过了抽象类和接口各自的特点后,下面我们就来看下抽象类和接口的区别:
第一:接口定义类的公共行为,抽象类定义类的公共实现
第二:一个类只能继承自一个类(抽象类),但是可以同时实现多个接口
第三:接口中不能有实现,抽象类中既可以有未实现的成员,也可以有实现的成员
第四:接口中未实现的方法必须在子类中实现,抽象类中未实现的成员必须在子类中重写
第五:好的接口定义应该是具有专一功能性的,而不是多功能的,否则会造成接口污染。如果一个类只是实现了这个接口中的一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
看过了抽象类和接口的区别后,我们接着来看下抽象类和接口的应用场合。
什么时候使用抽象类,什么时候使用接口?
首先我们强调下:抽象类主要用于关系密切的对象;而且接口适合为不相关的类提供通用功能。
例如:飞机会飞,鸟也会飞,他们都继承了同一个接口”飞”;但是“波音747”属于飞机抽象类,大雁属于鸟抽象类。
或者是如下比喻:
就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。
最后用一张简单的表格对两者进行一个对比: