何时使用继承和复用

当两个事物可以用 has-a 和 is-a

has - a 有一个就是说一个类中含有另一个类的实例是复用

is--a 是一个,,它是它的父类。。。明显可以使用继承。。

### 聚合复用继承复用的区别优劣 #### 定义与基本概念 聚合复用是一种基于组合的方式实现功能重用的技术,其核心思想是一个类通过持有另一个类的对象作为成员变量来完成特定的功能[^3]。这种方式强调的是“拥有”的关系,即一个对象包含了其他对象。 继承复用则是通过子类扩展父类的行为属性来实现功能重用的一种方式。在这种机制下,子类可以直接访问并利用父类已有的方法字段,从而减少重复代码的编写。 --- #### 主要区别 1. **耦合度** - 聚合复用通常具有较低的耦合度,因为被聚合的对象可以通过接口或抽象类定义行为,而不需要暴露其实现细节[^1]。 - 继承复用则可能导致较高的耦合度,尤其是当子类紧密依赖于父类的具体实现时,任何对父类的修改都可能影响到所有的子类。 2. **灵活性** - 使用聚合复用可以在运行时动态改变所使用的组件实例,这种特性使得系统更加灵活且易于调整。 - 继承复用由于是在编译期固定的,因此缺乏类似的动态适应能力,一旦需求发生变化,往往需要重构整个继承层次结构。 3. **可维护性** - 基于聚合的设计更容易满足开闭原则(Open-Closed Principle),因为它允许新增功能而不必改动现有代码[^4]。 - 过度使用继承可能会违反里氏替换原则(Liskov Substitution Principle),导致难以预测的行为以及增加后期维护成本。 4. **复杂性管理** - 频繁采用继承容易造成复杂的类层级结构,这不仅增加了理解调试难度,还可能引发多重继承带来的钻石问题。 - 合理运用聚合能够简化设计模型,使各模块职责分明,降低整体复杂程度。 --- #### 应用场景对比 - 当目标是创建一种松散关联的关系或者希望增强系统的弹性时,应优先考虑聚合复用策略。例如,在构建插件化框架时,让主应用加载不同的服务提供者而非硬编码这些逻辑便是典型例子之一。 - 如果确实存在明确的父子关系,并且共享相同的核心特征,则可以适当引入继承复用来表达此类语义上的联系。不过需要注意控制好继承链长度以免带来不必要的麻烦。 --- ```java // 聚合复用示例 public class Car { private Engine engine; public void setEngine(Engine e){ this.engine = e; } public void start(){ if(engine != null){ engine.start(); } } } interface Engine{ void start(); } ``` 上述代码展示了如何借助接口类型的成员变量达成解耦效果的同时保留了足够的自由度去切换不同种类引擎实现版本。 相比之下: ```java // 继承复用示例 class Animal { String name; public void eat(){} } class Dog extends Animal{ @Override public void eat(){ System.out.println("Dog eating"); } } ``` 这里展示了一个简单的继承案例,其中`Dog`继承自`Animal`,虽然简单明了但对于某些情况未必是最优解决方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值