- 所谓面向抽象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象;
- abstract类只关心操作,不关心这些操作具体实现的细节,使程序的设计者把主要精力放在程序的设计上,而不必拘泥于细节的实现(将细节留给子类设计者),避免设计者把大量的时间和精力花费在具体的算法上。在设计程序时,可通过在abstract类中声明若干个abstract方法,表明这些方法在整个系统设计中的重要性,方法体的内容细节由它的非abstract子类去完成
- 对于abstract修饰的方法,只允许声明,不允许实现(没有方法体),不允许使用final和abstract同时修饰一个方法或类,final的使用规则
- 求体积,底面积设置为抽象接口,继承实现抽象底面积方法,长方形正方形;在我们使用的时候,只需要传递过去参数即可
abstract class Bottom(){ abstract double getArea();}
public class Pillar{double h; Bottom b;Pillar(Bottom b,double h){this.b=b;this.h=h} public double getVolume(){return b.getArea()*h;}}
public class Circle extends Bottom{ double r; Circle(double r){this.r=r} public double getArea(){}}
public class Rectangle extends Bottom{ double r; Circle(double r){this.r=r} public double getArea(){}}
public class Demo{psvm(){ Bottom bottom; bottom=new Circle(1);bottom=new Rectangle(1); Pillar p=new Pillar(bottom,1) }}
开闭原则(Open-Closed Principle)--对扩展开放,对修改关闭。指当系统中增加新的模块时,不需要修改现有的模块。在设计系统时,应当首先考虑到用户需求的变化,将应对用户变化的部分设计为对扩展开放,而设计的核心部分是经过精心考虑之后确定下来的基本结构,这部分应当是对修改关闭的,即不能因为用户的需求变化而变化,因为这部分不是用来应对需求变化的。如果系统的设计遵守了开闭原则,那么这个系统一定是易维护的,因为在系统中增加新的模块时,不必去修改系统中的核心模块。
对上面实例,若在添加一个计算三角形的面积,那么Pillar类不需要做任何修改(对Pillar类的修改关闭),应用程序就可以使用Pillar类创建出具有Bottom的新子类指定的底的柱体。
通常我们无法让设计的每个部分都遵守开闭原则,甚至不应当这样去做,应当把主要精力集中在应对设计中最有可能因需求变化而需要改变的地方,然后想办法应用开闭原则。