我们都知道,什么是接口,什么是继承,那么在什么场景下我们使用继承,又在什么场景中使用接口?
继承:子类会继承父类的属性和方法,但是却不需要重写父类的方法,父类和子类存在着包含关系,比如动物和鸟
接口:继承该接口的类同样也会完全继承接口的属性,方法必须重写,在大多数情况下,定义的接口实际上只有方法没有属性。
使用继承的场景一般是为了给实体类添加额外属性或者提取共同属性而创建一个的基类,这时实体类继承这个基类,就具有了额外属性或者共同属性。
使用接口的场景就广泛的多,当一个类有共同的使命,比如说要完成一件共同的事,可能他们之间并没有任何关系,只是做的事情相同,比如Mybatis 里的 Executor 就是典型的接口,只是为了执行对数据库的操作 。
确定一个公共的接口一定要小心,因为一旦你更改了接口,就以为着你需要更改所有实现这个接口的类。或者进一步的说就是抽象类的演化相比较接口要容易得多。
抽象类只能单继承,这意味着它在扩展方面是不如接口的。
举一个继承的例子,比如在一个大型公司内部使用的管理职员的网站中,我们可以把一些必须具有的属性以及为了方便我们操作比如从数据库取出数据以后为了翻译而要添加的属性。主键id 这个每个用户都有,实体属性来源origin,实体属性版本ts,实体属性删除标志dr,实体属性租户tenant_id。这些信息放在基类里,以后添加的每个实体类继承这个类就具有了这些属性,也就能完成我们想要的操作。