平时在我们工作中应该可以看到大量继承和实现的代码,那么此时就有一个问题了,什么时候用继承(extends),什么时候用实现(implements)呢?
1. 什么时候用到继承?
如果说项目中有重复的代码块,可以将这些重复的代码块收提取出来放到一个公共类中,让其他的模块继承这个类。例如:
- public class EasySqlInjector extends DefaultSqlInjector {
-
-
- @Override
- public List<AbstractMethod> getMethodList(Class> mapperClass, TableInfo tableInfo) {
- // 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法
- List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
- methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
- return methodList;
- }
-
- }
我在用到mybatisplus批量插入的时候构造了一个sql注入器,我让其继承了一个DefaultSqlInjector类,那么这个类就相当于父类,并且用到了父类中getMethodList方法,这个方法就相当于公用的代码,如果还有其他子类想要使用这个方法时只需继承这个类就好。
所以说:当有重复的代码块时,将其抽取出来放到一个公共类中,使其子类继承这个类即可。
2 . 什么时候用到实现?
如果项目中的模块都遵循于一个规范,这个规范每个模块的实现参数都不同,那么可以将这些参数都提取到接口中,其他模块实现此接口定义自己的相关功能即可。例如:
一个AbstractSqlInjector实现了ISqlInjector这样的一个接口,可以发现接口中定义了一套规则(没有具体的方法体,只有方法和参数),当有其他的类想要用到这套规则时自己实现该接口就好。