为什么尽量少用继承?
时间:2020-05-12
本文章向大家介绍为什么尽量少用继承?,主要包括为什么尽量少用继承?使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、继承的缺点是什么?为什么不推荐使用继承?
如果滥用继承,会导致继承层次过深,复杂的继承关系。导致维护性降低。(如果继承关系层次少,不fu)
(继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问
题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。在这种
情况下,我们应该尽量少用,甚至不用继承。)
2、我们有什么手段可以替代继承呢?
可以用组合,接口,委托来实现。我们下看看下面的代码:
public interface Flyable {
void fly();
}
public class FlyAbility implements Flyable {
@Override
public void fly() { //... }
}
// 省略 Tweetable/TweetAbility/EggLayable/EggLayAbility
public class Ostrich implements Tweetable, EggLayable {// 鸵鸟
private TweetAbility tweetAbility = new TweetAbility(); // 组合
private EggLayAbility eggLayAbility = new EggLayAbility(); // 组合
//... 省略其他属性和方法...
@Override
public void tweet() {
tweetAbility.tweet(); // 委托
}
@Override
public void layEgg() {
eggLayAbility.layEgg(); // 委托
}
}
3、 组合相比继承有哪些优势?
继承主要有三个作用,表示is-a关系,支持多态特性,代码复用。而这三个作用都可以通过组合、接口、委托三个技术手段来达成。
除此之外,利用组合还能解决层次过深,过复杂的继承关系影响代码可维护性
4、如何判断该用组合还是继承?
如果类之间的继承结构稳定,层次比较浅,关系不复杂,我们就可以大胆地使用继承。
反之,我们就尽量使用组合来替代继承。除此之外,还有一些设计模式,特殊的应用场景,会固定使用继承或者组合
5、有人极力不使用继承,原因是什么?
- 人无法预知未来,现在比较稳定的类继承关系将来未必稳定。
2.两种设计之间的选择耗费资源,每次都要为这个问题拿捏一下,甚至争论一下,不如把
争论放在业务逻辑的实现上。
3.相对于接口+组合+委托增加的复杂度,代码统一成接口+组合+委托带来的好处更多,
GO完全摒弃了继承,在语法上只有组合,接口之间也可以组合(这也是官方鼓励的做法)。
问题:
我们在基于 MVC 架构开发 Web 应用的时候,经常会在数据库层定义 Entity,在 Service业务层定义 BO(Business Object),在 Controller 接口层定义 VO(View Object)。大部分情况下,Entity、BO、VO 三者之间的代码有很大重复,但又不完全相同。我们该如何处理 Entity、BO、VO 代码重复的问题呢?
VO和BO都会采用组合entity的方式
原文地址:https://www.cnblogs.com/vingLiu/p/12878257.html
- spring-boot 速成(1) helloworld
- 协议森林16 小美的桌号(DHCP协议)
- struts2(一)之初识struts2
- AI聊天机器人备受青睐 专家呼吁少卖萌
- CQRS框架:AxonFramework 之 Hello World
- Kubernetes的服务网格(第4部分):通过流量切换持续部署
- TortoiseGit安装与配置
- mongodb 速成笔记
- oAuth 2.0 笔记
- JavaScript内置对象--Math对象
- oAuth 2.0 笔记
- common-pool2 学习:thrift连接池的另一种实现
- IntelliJ IDEA 17和Maven构建javaWeb项目
- spring-boot 速成(2) devtools之热部署及LiveReload
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 58道Vue常见面试题集锦,涵盖入门到精通,自测 Vue 掌握程度
- 记一次Linux计划任务cron无结果的排查过程
- 一文学会使用 CSS 中的 min(), max(), clamp() 以及它们的使用场景用例
- 5 个 JS 数组技巧可提高你的开发技能
- 一个有意思的方案:不借助后台和 JS ,只用 CSS 让一个列表编号倒序,你会怎么做?
- 关于MySQL LOAD DATA特性的利用与思考
- NHibernate 缓存
- 渗透测试 | 突破前端JS加密限制
- 使用 Task 简化异步编程
- Task 编程中的异常处理
- AngularJS 中的 factory、 service 和 provider
- 设计模式之适配器模式
- 设计模式之组合模式
- MvvmCross 框架中的数据绑定语法
- Vivado IP核锁定的解除方法