外观
接口、继承和多态,怎样让业务代码更容易替换?
标准回答
把接口理解为一份“能做什么”的约定,把实现类理解为“具体怎么做”。业务只依赖约定,就可以换实现。继承适合确实存在的“是一种”关系;拼装功能时,组合通常更容易控制影响范围。
- 接口表达能力,具体类承担实现;变量的声明类型与运行时对象类型可能不同。
- 重写是子类改变实例方法行为;重载是同名方法使用不同参数,选择规则不同。
- 通过构造函数注入依赖,测试时换成可控实现,避免到处 new 硬件对象。
通俗例子
空调页面依赖 ClimateRepository。真车版从车辆服务读温度,演示版从内存读温度。页面调用同一个 getTemperature(),运行时由不同实现完成工作,这就是多态的一个实际用途。
深入解释
**多态发生在哪里:**变量声明为 ClimateRepository 接口,但实际对象可以是真车实现或演示实现。调用同一个实例方法时,实际对象决定执行哪份重写后的逻辑。
**为什么利于替换:**页面只知道“读取温度”这一能力,不直接依赖车辆 SDK 的创建细节。换成测试实现时,页面调用方式不变,从而能在没有真车时验证业务。
易混淆点
继承层次越深不代表设计越好。不要为了复用几行代码建立不真实的父子关系。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
job-J01