网上也有关于抽象类和接口的区别,但更多的是侧重于应用方式,没有从应用场景上深挖,比如什么情况下用抽象类,什么情况下用接口,本文从应用场景和应用方式上介绍区别。
应用场景
接口的目的是提供一个标准让大家来遵守,可以是不同类别的类都来遵守,比如礼花和航天飞机都遵守一个“发射接口”;
而抽象的目的是我无法实现它,由继承我的类来实现,比如说触摸屏抽象类的触摸方法:有的触摸屏是电容屏,得用手指去写;有的触摸屏是电容屏,得用笔或指甲盖去划。
再举个例子,以手机为例,假如用抽象类,得这样设计:
这种设计就存在一个问题,这就要求每一个手机必须拥有如上的功能,这显然是不现实的,我这个手机无法照相,那这个类就跑不起来了。如果改成接口:
应用方式
抽象类
- 不能对字段抽象(因为字段只能用等号赋值,没其他代码(不同于属性),没啥抽象的意义);
- 不能对 private 抽象;
- 可以含有非抽象的成员;
- 不能实例化;
- 只能从一个类继承;
- 可以被抽象类继承,此时不必实现抽象成员;
- 可以被普通类继承,此时必须实现抽象成员(网上有些说的不必实现,其实那有错误,普通类继承自抽象类时,必须实现抽象类的全部抽象成员);
- 实现抽象成员时要加 override;
接口
- 不能对字段接口(因为字段只能用等号赋值,没其他代码(不同于属性),没啥接口的意义);
- 接口只能是 public 的,且不能使用 public 关键字;
- 除了接口成员,不能有其他任何实现代码;
- 不能实例化;
- 可以从多个接口继承;
- 可以被接口继承;此时不必也无法实现接口成员;
- 可以被抽象类继承,此时必须实现接口成员;
- 可以被普通类继承,此时必须实现接口成员;
- 实现接口不能加 override,必须加 public。