代码复用原则:合理使用类组合和类继承

继承和组合都可以达到代码复用的目的,但是组合比继承更具灵活性。
组合是通过引用已有类(一般为抽象类)或接口来实现复用的组合在运行时通过多态可以动态替换被组合的对象。
继承是通过以子类继承父类方式来使父类的非私有成员可以被其子类使用。继承在类编译时就确定了继承来的方法和

属性,无法在运行时动态改变从父类继承来的方法。如果继承得来的某个方法在子类中不适用,这时就需要重写该方

法。而这样又很有可能违反LSP设计原则。如果父类非私有成员发生了改变那么继承他的子类也不得不发生改变父类改

变。所以这种复用方式仅限于行为上的IS-A关系时才使用.

网络的例子:

t:如果你要用到一个类中的所有方法但还想多几个方法(你自己写)一起用,你有什么方法实现,
s:一般我会直接继承它,估计是答错了,能否继续把你的话说完。

t:
就单个实现来说没有正确错误之分   
    
 
你如果是用继承来解决这个问题就是采用了高耦合的手段   
    
 
也就是说子类B包含了超类A,子类B对超类A有强的依赖性   
继续:   
 
当B对A的依赖性是稳定的,用继承不会有任何问题   
    
 
但当B有变心,希望有一个长得象A,但是某些实现上与A有所不同的伙伴的话,由于是继承就不行了。也就是A与B都

要重新定义   
    
 
如果我们最初就发现了B比较花心,那就不用继承,用聚合来完成   
 
也就是B中包含A的实例变量,由B的构造函数传入A的实例   
    
 
那只要写个A的子类A1

在实例B的时候传入不同的A就行

代码复用原则:合理使用类组合和类继承,布布扣,bubuko.com

时间: 2024-12-24 05:25:15

代码复用原则:合理使用类组合和类继承的相关文章

Python_类组合和类继承的使用场景

1.什么时候使用类的组合?当类之间有显著的不同,并且较小的类是组成较大类所需要的组件,此时用类的组合较合理:场景:医院是由多个科室组成的,此时我们可以定义不同科室的类,这样医院的类我们可以直接使用各个不同科室的类进行组合即可:2.什么时候使用类的继承?当类之间有很大相似的功能,我们可以提取这些共通的功能做成基类,其他类直接调用基类即可,此时使用类的继承合理.场景:医院有患者.医生,都属于人,都有吃饭.睡觉.年龄.性别等方法或特征,这样,我们可以先定义人的类(包含以上的方法和特征),那么我们在定义

组合/聚合复用原则

组合/聚合复用原则(Composite/Aggregate Reuse Principle)是面向对象设计原则的一种.组合/聚合复用原则是指尽量使用组合/聚合,不要使用类继承.在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的.就是说要尽量的使用合成和聚合,而不是继承关系达到复用的目的. 组合/聚合复用原则是什么 尽量采用组合(contains-a).聚合(has-a)的方式而不是继承(is-a)的关系来达到软件的复用目的 假如新对象的

javascript代码复用模式(二)

前面说到,javascript的代码复用模式,可分为类式继承和非类式继承(现代继承).这篇就继续类式继承. 类式继承模式-借用构造函数 使用借用构造函数的方法,可以从子构造函数得到父构造函数传任意数量的参数.这个模式借用了父构造函数,它传递子对象以绑定到this,并转发任意数量的参数: function Child(a,b,c,d){ Parent.apply(this,arguments); } 在这种方式中,只能继承在父构造函数中添加到this的属性,并不能继承添加到原型中的成员. 使用借用

代码重构原则

1. 总则 总则规定了一些大体原则,必须要作的.最需要注意的事项.也是面向目前我们的代码中亟需解决的一些问题: (1)头文件.源文件布局混乱,直接影响编译效率 (2)有编程规范,但遵守的很差 (3)过长函数 (4)大量重复代码 1.1 源文件 源文件原则: ● 函数行数尽量不要超过50行,超过50行的目前阶段并非严格禁止,但需要说明理由 ● 源文件长度尽量不要超过500行, 不同子功能.子模块的代码不要放在一个源文件中:理论上源文件分的越细越好.保证同一源文件中的代码“强内聚”. ● 无特殊情况

用基类接品,泛型抽象类,抽象方法实现代码复用

1.定义一个基类接口 ? 1 2 3 4 5 6 7 8 9 10 public interface IBaseEntity { /// <summary> 最后操作人编码 </summary> string LastOperatorCode { get; set; } /// <summary> 最后操作人 </summary> string LastOperator { get; set; } /// <summary> 最后操作时间 <

C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义(转载)

C#与Java对比学习:类型判断.类与接口继承.代码规范与编码习惯.常量定义 类型判断符号: C#:object a;  if(a is int) { }  用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 instanceof 符号判断 类与接口的继承: C#:public class MDataRow : List<MDataCell>, IDataRecord, ICustomTypeDescriptor Java:publi

java类的封装 继承 多态

1.猜数字小游戏 package cn.jiemoxiaodi_02; import java.util.Scanner; /** * 猜数字小游戏 * * @author huli * */ public class GuessNumberDemo { public static void main(String[] args) { int number = (int) (Math.random() * 100) + 1; while (true) { System.out.println("

C++进阶--代码复用 继承vs组合

//############################################################################ /* * 代码复用: 继承 vs 组合 */ //继承实现代码复用 class BaseDog { ... ... // 公共的操作 }; class BullDog : public BaseDog { ... // 调用公共操作,执行更多任务 }; class ShepherdDog : public BaseDog { ... //

python24 面向对象的绑定方法 类与类之间的继承

## 类属性与对象属性 类中应该仅存储所有对象共有的内容 ? 如所有人的国籍相同那就放到类中 对象中存储每个对象独有的内容 ? 如每个人的名字都不同 ## __init__方法的作用 init 是初始化的缩写 用于为对象的属性设置初始值 特点: ```# 执行时机:当实例化产生对象时会自动执行该函数# 会自动传入需要初始化的对象# 初始化必须包含至少一个参数 用于表示对象本身# 该函数不允许有返回值 必须为None``` ## 绑定方法 绑定即两个东西绑在一起 方法就是函数 那就是说绑定方法 =