什么时候该用接口,什么时候该用抽象类

很多人在面试过程中都会被问到这个问题,语法上的区别大家都知道,但是如果面试时你只说语法上的区别估计面试官会在心里扣你两分
下面说说这两者在设计方面的区别:
接口大家比较熟悉一点,因为现在的MVC架构业务层规范就是先写接口再写实现类,那大家有没有想过,用抽象类代替这些接口,是否可行呢?从语法上当然是可行的,但是不会这样做,为什么呢?大材小用,理念不同..接着往下看
举个例子,领导说了,需要有个订单报表,可以导出excel,于是你定义了一个接口和一个实现类:


此时接口就可以完全胜任,无需动用抽象类。程序正常运行,报表导出OK,一切都很完美

后来,领导又说了,商品报表也需要导出,你的第一反应是下面这样嘛?o(╥﹏╥)o

后面领导又说了,还得加N个报表,并且每种报表都要支持日报、月报、季报、年报....,都用加接口的方式,能实现嘛?当然可以,但是很明显,一点也不优雅。我们从上面几张图可以很明显看出重复部分,即:

不同点就在于数据统计,其他部分逻辑重复,是可以抽出来的。注意了:抽象类的场景出来了,我们的类要做一件事情,这件事情分为几个步骤,有些步骤是固定的,有些步骤需要根据不同情况有不同实现,这时候就应该想到抽象类,我们先看代码,再对其进行介绍:

可以看到,报表导出方法分为四步,被抽成四个方法,有三个公共方法,一个抽象方法为查询报表数据,由于不同的报表,数据查询逻辑不一样,所以它应该被作为抽象方法,由子类去实现。子类只需要实现该抽象方法即可,比如订单子类就去查询并统计订单库,商品子类就去查询并统计商品库:


如此,不管加什么报表,只需要实现这个数据查询方法即可,显然比接口方式要优雅很多。

我们可以看到抽象类就相当于一个模板,模板中有子类可以公用的部分,也有需要子类自行实现的部分,是为模板式设计
而接口是对行为的抽象,它只定义一组行为规范,每个实现类都要实现所有规范,叫辐射式设计

猜你喜欢

转载自www.cnblogs.com/code906/p/12687109.html