------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
这个问题无论使用abstract类还是接口都是适用的。
面向抽象编程:指的是设计某些重要的类时,不让该类面向具体的类,而是面向抽象类。即设计中重要的数据是抽象类声明的对象,而不是具体类声明的对象。
重点:
1.abstract类的使用:abstract类只关心操作,不关心这些操作具体的实现细节。
2.多态:使用多态进行程序设计,核心技术之一是使用上转型对象。abstract类声明的对象作为其子类的上转型对象,用这个上转型对象就可以调用子类重写的方法。
面向接口编程:与面向对象编程很像,只不过把抽象类换成了接口。
抽象类与接口的异同:
同:都可以有抽象方法。
异:接口中只能有常量,接口中只能有abstract方法。而抽象类不同,可以有变量,可以有具体的方法。
重点:
1.接口的使用:如果子类除了要实现特定的方法,还要继承一些成员,那么就用抽象类,如果是单纯的需要实现某个方法,那么就可以考虑使用接口。
2.接口回调:实则是和抽象类的转型对象用法一样,不赘述了。
举例:
这里有一个圆类,内含求面积的方法
public class Circle{
double r;
Circle(double r){
this.r =r;
}
public double getArea(){
return (3.14*r*r);
}
}
有一个柱体类,用来求圆柱的体积
class Pillar{
Circle bottom;
double height;
Pillar(Circle bottom,double height){
this.botton = bottom;
this.height = height;
}
public double getVolume(){
return bottom.getArea()*height;
}
}
我们发现,这个程序用来求圆柱的体积是没有任何问题的,但是以后我们想扩展,将其用来求长方体的体积,或者用来求地面是其他图形的柱体,就不得不改写程序。
这时,我们可以用面向抽象或者面向接口编程。
新建一个抽象类或者接口:
abstract class Geometry{
public abstract double getArea();
}
interface Geometry{
public abstract double getArea();
}
这个问题无论使用abstract类还是接口都是适用的。
然后我们稍稍改写Pillar类
class Pillar{
Geometry bottom;
double height;
Pillar(Geometry bottom,double height){
this.botton = bottom;
this.height = height;
}
public double getVolume(){
return bottom.getArea()*height;
}
}
然后只需要继承Geometry类或者实现Geometry接口,然后将对象传进Pillar类中即可。无论是上转型对象的使用还是接口回调,在这里都是一样的。
开闭原则:对扩展开放,对修改关闭。
上述例子中,我们让Geometry类可以被继承,其可以用无数个子类,这就是对扩展开放。
但是Pillar类是核心,不应该再被修改,所以应该对修改关闭。