1、抽象类就是将类似或相似的部分给抽取出来。比如可以重写一个公共类,然后实例化这个公共类,调用相同的方法就可以了。
2、抽象类特性:
1)非抽象子类必须完全实现这个抽象中所有的抽象方法。
2)抽象类不能被实例化,它的意义在于被扩展。访问方式TestClass::test(‘我是抽象方法’);。
3)抽象类通常(也可以没有)至少有1个抽象方法,抽象方法中没有大括号。非抽象方法是有的。
4)抽象方法不必实现具体的功能,由子类来完成。
5)在子类实现抽象类的方法时,其子类的可见性必须大于或等于抽象方法的定义。
6)抽象类的方法可以有参数,也可以为空。
7)如果抽象方法有参数,那么子类的实现也必须有相同的参数个数。
3、与接口的不同点:
1)抽象类中可以有非抽象的方法而接口中只能够有抽象的方法!
2)一个子类可以继承多个接口,而一个类只能继承一个抽象类!
3)接口的使用方式通过implements关键字进行,抽象类则是通过继承extends关键字进行!
4)接口中只能声明抽象方法(包括静态抽象方法)和静态变量。而抽象类除了包含一般类的特点,即包括属性和一般方法外,还可以声明抽象方法(包括静态抽象方法)。
5)在写法上:接口中的抽象方法前不用也不能加abstract关键字,默认隐式就是抽象方法,也不能加final关键字来防止抽象方法的继承。而抽象类中抽象方法前则必须加上abstract表示显示声明为抽象方法。
接口中的抽象方法默认是public的,也只能是public的,不能用private、protected修饰符修饰。而抽象类则可以。
6)一个非抽象类如果extends一个抽象类后只需(并且必需)所有的实现抽象方法就行了,非抽象方法可以不实现。如果implements一个接口,就必须实现接口中的所有方法(因为接口中的方法均为抽象方法)。
4、面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。
5、接口的本质
接口,在表面上是由几个没有主体代码的方法定义组成的集合体,有唯一的名称,可以被类或其他接口所实现(或者也可以说继承)。它在形式上可能是如下的样子:
interface InterfaceName
{
void Method1();
void Method2(int para1);
void Method3(string para2,string para3);
}
可以从以下两个视角考虑:
1)接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体现了自然界“如果你是……则必须能……”的理念。
2)接口是在一定粒度视图上同类事物的抽象表示。
注意这里强调了在一定粒度视图上,因为“同类事物”这个概念是相对的,它因为粒度视图不同而不同。
6、面向接口编程综述
在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。
这样做的好处是,首先对系统灵活性大有好处。当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉。
使用接口的另一个好处就是不同部件或层次的开发人员可以并行开工,就像造硬盘的不用等造CPU的,也不用等造显示器的,只要接口一致,设计合理,完全可以并行进行开发,从而提高效率。
7、接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
接口应有两类:
第一类是对一个体的抽象,它可对应为一个抽象体;第二类是对一个体某一方面的抽象,即形成一个抽象面;一个体有可能有多个抽象面。
8、设计接口的另一个不可忽视的因素是接口所处的环境,系统论的观点:环境是系统要素所处的空间与外部影响因素的总和。任何接口都是在一定的环境中产生的。因此环境的定义及环境的变化对接口的影响是不容忽视的,脱离原先的环境,所有的接口将失去原有的意义。
按照组件的开发模型(3C),它们三者相辅相成,各司一面,浑然一体,缺一不可。
9、面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法。
面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现。
接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题。