接口:一晚深夜,一个作家闲来无事,忽然兴起,要写本小说。一想好小说的主线路,于是就列好提纲,列好后累了,然后就睡觉去了。所以,就留下了接口,等想起哪天要写时就继续去写。
但接口有一个缺点,就是不能代码重用。假设有100个类实现同一个接口,而这个接口中的一个方法在这100个类中至少有50个类的实现是完全一样的,那么使用接口就意味会多编写49个同样的方法,代码大量重复。当然,还有另外的方法,就是使用组合的方式(IOC模式更好),但这也要多编写一些代码。而且设计更复杂。最好的方法就是在接口中加入该方法的默认实现,但这和接口的定义相冲突,接口中不能有具体的实现代码。但在接口中加入实现代码,在实现该接口的子类中继承(也可覆盖)的确是一个非常好的方法。于是面向对象语言的设计者不得不加入了一个新的面向对象元素。这个新元素的目的有如下两个:
1. 也同样可起到定义规范的作用
2. 可以有默认的方法实现
第1点与接口相同,接口就意味着抽象(用来定义抽象规则)。而第2点是类的行为。因此,这些专家们就给这个新的面向对象元素起名为抽象类,含义就是同时兼有接口和类的特性(除了实例化外)。在很多规范中也使用了抽象类来定义规则,因此这些规范需要提供一些默认的实现。我们也可以将接口、抽象类、类看成是一软件中的滑动控件,当滑杆拉到最左边,也就是抽象类中没有任何的默认实现,就是接口,而将滑杆拉到最右边,抽象类中所有的方法都有默认的实现,就类似于类(这里并不等于类,因为抽象类无法实例化,但除了实例化外,其他和普通类已经完全一样了)。如果滑杆在中间的任何位置,就是普通意义的抽象类(至少有一个抽象方法需要子类实现,除非子类也是抽象类)。
抽象类:一晚深夜,一个作家闲来无事,忽然兴起,要写本小说。一想好小说的主线路,于是就列好提纲,列好后精神很好,就继续写了小说上的内容,东写西写,然后就睡觉去了。所以,就留下了抽象类,等想起哪天要写时就继续去写。
但接口有一个缺点,就是不能代码重用。假设有100个类实现同一个接口,而这个接口中的一个方法在这100个类中至少有50个类的实现是完全一样的,那么使用接口就意味会多编写49个同样的方法,代码大量重复。当然,还有另外的方法,就是使用组合的方式(IOC模式更好),但这也要多编写一些代码。而且设计更复杂。最好的方法就是在接口中加入该方法的默认实现,但这和接口的定义相冲突,接口中不能有具体的实现代码。但在接口中加入实现代码,在实现该接口的子类中继承(也可覆盖)的确是一个非常好的方法。于是面向对象语言的设计者不得不加入了一个新的面向对象元素。这个新元素的目的有如下两个:
1. 也同样可起到定义规范的作用
2. 可以有默认的方法实现
第1点与接口相同,接口就意味着抽象(用来定义抽象规则)。而第2点是类的行为。因此,这些专家们就给这个新的面向对象元素起名为抽象类,含义就是同时兼有接口和类的特性(除了实例化外)。在很多规范中也使用了抽象类来定义规则,因此这些规范需要提供一些默认的实现。我们也可以将接口、抽象类、类看成是一软件中的滑动控件,当滑杆拉到最左边,也就是抽象类中没有任何的默认实现,就是接口,而将滑杆拉到最右边,抽象类中所有的方法都有默认的实现,就类似于类(这里并不等于类,因为抽象类无法实例化,但除了实例化外,其他和普通类已经完全一样了)。如果滑杆在中间的任何位置,就是普通意义的抽象类(至少有一个抽象方法需要子类实现,除非子类也是抽象类)。