【面向对象设计基础】抽象类
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
1.抽象类的特点:
包含至少一个以abstract表示的没有实现的方法——抽象方法,来代表父类中的可变方法。当然抽象类可以提供实现的具体方法。
包含的有具体实现的方法来代表父类中的不可变的通用方法。
不能被实例化。
子类继承时必须实现去所有抽象方法,否则子类也是一个抽象类,不能被实例化。这样的设计是使得方法签名上保持持续性。(方法签名是指:方法的名称,参数的数量和参数的类型这三部分,不包含返回类型。可以通过不同的方法签名来重载一个方法。) 也就是说,抽象类设定了一个契约,子类必须完成这个契约所规定的部分。
2.模式UML:
3.例子:
省略
注意:
1)Java不支持多继承,所以使用继承的原则是首选接口,简洁为上,也就是说只在必须使用的时候使用继承,除非要实现的方法中太多是确定的。因为接口的使用也有弊病,由于接口中的方法并不实现,这就意味着每一个对接口的直接实现都要显式的实现所有接口中声明的方法,即使这个方法对于所有的接口实现者都是不变固定的。
2)结合这两种基本模式,我们就能得到一个经典模式——缺省适配模式。声明类型的工作仍然由Java接口承担,但是同时给出一个Java 抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类,也就是说在层次结构中,Java 接口在最上面,然后紧跟着抽象类,这将两个的最大优点都能发挥到极至了。在Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。
3)在继承上遵循以下原则:使用Java接口和抽象Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。而不要用具体Java类进行这些。如果你准备写一个具体类去继承另一个具体类的话,那你的设计就有很大问题了。
4)抽象类可以完成这样的一种需求:在功能中必须完成某一个逻辑,但是在子类中该功能的具体定义中除了这段逻辑外又有所不同。
参考文献:
http://www.cnblogs.com/fanqimeng/archive/2009/05/13/1456183.html