首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在设计原则中,为什么反复强调组合优于继承

原作者:Kevin.ZhangCG面向对象编程中,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承。...Java代码的复用有继承组合以及委托三种具体的实现形式。  对于上面提到的继承带来的问题,可以利用组合(composition)、接口、委托(delegation)三个技术手段一块儿来解决。  ...如何判断该用组合还是继承  尽管我们鼓励多用组合少用继承,但组合也并不是完美的,继承也并非一无是处。从上面的例子来看,继承改写成组合意味着要做更细粒度的类的拆分。...反之,系统越不稳定,继承层次很深,继承关系复杂,我们就尽量使用组合来替代继承。  除此之外,还有一些设计模式会固定使用继承或者组合。...有的地方提到组合优先继承这条软件开发原则时,可能会说成“多用组合,少用继承”。所谓多用与少用,实际指的是要弄清楚在具体的场景下需要哪种。软件开发原则这类问题,不宜死扣字眼。

70820

在设计原则中,为什么反复强调组合优于继承

面向对象编程中,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承。同样地,在《阿里巴巴Java开发手册》中有一条规定:谨慎使用继承的方式进行扩展,优先使用组合的方式实现。 ?...Java代码的复用有继承组合以及委托三种具体的实现形式。   对于上面提到的继承带来的问题,可以利用组合(composition)、接口、委托(delegation)三个技术手段一块儿来解决。   ...如何判断该用组合还是继承   尽管我们鼓励多用组合少用继承,但组合也并不是完美的,继承也并非一无是处。从上面的例子来看,继承改写成组合意味着要做更细粒度的类的拆分。...反之,系统越不稳定,继承层次很深,继承关系复杂,我们就尽量使用组合来替代继承。   除此之外,还有一些设计模式会固定使用继承或者组合。...有的地方提到组合优先继承这条软件开发原则时,可能会说成“多用组合,少用继承”。所谓多用与少用,实际指的是要弄清楚在具体的场景下需要哪种。软件开发原则这类问题,不宜死扣字眼。

1.9K10
您找到你想要的搜索结果了吗?
是的
没有找到

JavaScript组合继承

组合继承(Combination Inheritance)是 JavaScript 中一种常用的继承模式,它结合了原型链继承和构造函数继承的优点。...通过组合继承,我们可以使用构造函数继承继承实例属性,并通过原型链继承继承共享的方法和属性。原理组合继承的原理是结合使用构造函数和原型链。...定义一个子类(派生类),它继承了父类的属性和方法。我们可以使用构造函数继承继承父类的实例属性和方法。将子类的原型设置为一个新创建的父类的实例。这样子类就能够通过原型链继承父类的共享属性和方法。...这种组合继承的方法能够实现子类既能够继承父类的实例属性和方法,又能够继承父类的共享属性和方法。它是 JavaScript 中常用的一种继承方式。...实现方法下面是组合继承的实现方法:// 父类function Parent(name) { this.name = name; this.colors = ['red', 'blue', 'green

23010

继承 , 组合 , 菱形继承 , 接口

class 子类(父类): pass 属性查找顺序 对象本身 -> 所在的类 -> 类的父类 -> .... object 抽象 使用基础时 应该先抽象 在继承...list.append(li,1) 子类访问父类的内容 1.指名道姓 直接写死了类名 即时不存在继承关系也能调用 2.super().要访问的属性 (py3出现的) 3....main__.B'>, , , , ] 四  , 组合...''' 组合: 指的是一个类把另一个类作为自己的属性来使用,就称之为组合 当你定义一个类,并且这个类拥有某种类型的属性时,就称之为组合 组合描述的是:什么拥有什么的关系,...# 在py2中 A就是一个经典类 # class A: # pass # 如果你的代码需要兼容py2 那应该显式的继承object 无论是直接还是间接继承 class B(object):

68910

【Java】继承、抽象、组合

参考链接: C++和Java中的继承比较 Java的继承、抽象、组合  类的继承基类和派生类继承语法:隐藏和覆盖   Object类包含的主要方法clone方法finalize方法getClass方法notify...、notifyAll、wait方法   终结类与终结方法终结类终结方法   抽象类包的应用Java基础类库   本章小结 类的继承  类的继承 一种由已有的类创建新类的机制,是面向对象程序设计的基石之一...通过继承,可以根据已有类来定义新类,新类拥有已有类的所有功能。...class) 也称超类(superclass)是被直接或间接继承的类  派生类(derived-class) 也称子类 (subclass)继承其他类而得到的类 继承所有祖先的状态和行为 派生类可以增加变量和方法...,一个继承自父类,另一个由自己声明当子类执行继承自父类的操作时,处理的是继承自父类的变量;而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量  访问被隐藏的父类属性  调用从父类继承的方法,则操作的是从父类继承的属性使用

71730

JavaScript进阶:组合继承和寄生组合继承

1、组合继承 组合继承了使用原型链实现对原型属性和方法的继承,同时配合使用构造函数继承实现对实例属性的继承。以免导致多个实例对引用类型的数据共享一份数据。理论上解决了之前继承方式带来的问题。...ChildClass) // true console.log(ChildClass.prototype); // ParentClass {name: 'lisi', getTime: ƒ} 这种继承方式同样并不完美...// 创建父类 function ParentClass(name) { this.name = name; console.log('执行了一次父类的构造函数') } 可以看出来,组合继承执行了两次父类的构造函数...2、寄生组合继承 使用Object.create()使得新创建的对象保持指向ParentClass的原型对象ChildClass.prototype = Object.create(ParentClass.prototype...console.log(child instanceof ChildClass) console.log(ChildClass.prototype); 这样在父类中打印是只执行了一遍父类的构造函数,这样就弥补了组合继承的缺点

85140

为何说要多用组合少用继承?如何决定该用组合还是继承

组合相比继承有哪些优势? 实际上,我们可以利用组合(composition)、接口、委托(delegation)三个技术手段,一块儿来解决刚刚继承存在的问题。...所以,从理论上讲,通过组合、接口、委托三个技术手段,我们完全可以替换掉继承,在项目中不用或者少用继承关系,特别是一些复杂的继承关系。 如何判断该用组合还是继承?...尽管我们鼓励多用组合少用继承,但组合也并不是完美的,继承也并非一无是处。从上面的例子来看,继承改写成组合意味着要做更细粒度的类的拆分。这也就意味着,我们要定义更多的类和接口。...反之,系统越不稳定,继承层次很深,继承关系复杂,我们就尽量使用组合来替代继承。 除此之外,还有一些设计模式会固定使用继承或者组合。...之所以“多用组合少用继承”这个口号喊得这么响,只是因为,长期以来,我们过度使用继承。还是那句话,组合并不完美,继承也不是一无是处。

1.9K20

Go:组合继承,为什么选择组合

在这篇文章中,我们将专注于Go语言中的一种重要特性:使用组合而不是继承。我们将探讨这种设计的背景和优点,并对比组合继承的差异。 Go语言的设计哲学 Go语言的设计理念强调简洁性和可用性。...在这种设计理念下,Go选择了组合(composition)作为其核心的代码复用机制,而不是继承(inheritance)。...最后,继承通常是在编译时确定的,这限制了程序的灵活性。例如,我们不能在运行时改变一个对象的类。 组合的优点 相对于继承组合提供了一个更为灵活、强大的代码复用机制。...这种方式使得我们可以在不引入继承的复杂性的情况下,轻松地重用代码。 总结 Go语言通过使用组合而非继承,提供了一种简洁、强大的代码复用机制。这种方式不仅使代码更容易理解和维护,而且提供了更高的灵活性。...尽管组合不能完全替代继承,在所有的场景下,但在许多情况下,组合是一个优于继承的选择。

32240

JS 继承

看过《JavaScript高级程序设计-第3版》 章节 6.3继承的读者应该知道,这2和3小点,正是寄生组合继承,书中例子没有第1小点。 1和2小点都是相对于设置了 proto链接。...推荐阅读JS继承相关的书籍章节 《JavaScript高级程序设计第3版》第6章——面向对象的程序设计 6种继承的方案,分别是原型链继承、借用构造函数继承组合继承、原型式继承、寄生式继承、寄生组合继承...上卷第6章——行为委托和附录A(ES6中的class) 总结 继承对于JS来说就是父类拥有的方法和属性、静态方法等,子类也要拥有。...继承方法可以有很多,重点在于必须理解并熟。 悉这些对象、原型以及构造器的工作方式,剩下的就简单了。寄生组合继承是开发者使用比较多的。...回顾寄生组合继承,主要就是三点: 子类构造函数的 proto指向父类构造器,继承父类的静态方法 子类构造函数的 prototype的 proto指向父类构造器的 prototype,继承父类的方法。

2.8K32

JavaScript寄生式组合继承

---- theme: channing-cyan 这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战 组合继承 组合继承也被称为伪经典继承,它综合了我们昨天说的原型链和盗用构造函数,将俩者的有点结合在了一起...组合继承弥补了原型链和盗用构造函数的不足,是js中使用最多的继承模式。 寄生式继承 寄生式继承就是用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象。...寄生式组合继承 组合继承存在这一定的效率问题,它的父类构造函数始终会被调用俩次,一次在创建字类原型时调用,另一次在子类构造函数中调用。本质上子类只需要在执行时重写自己的原型就行了。...subType; // 增强对象 subType.prototype = prototype; // 赋值对象 } 这个 inheritPrototype()函数实现了寄生式组合继承的核心逻辑...寄生式组合继承可以算是引用类型继承的最佳模式。

25530

js继承

类式继承 1.最常用的继承组合模式 —— 借用构造函数 & 设置原型 // 父类 function Parent(name) { this.name = name;...// 设置原型 继承父类this属性以及父类的原型 Child.prototype = new Parent(); 缺点:父构造函数被调用了两次,从而导致同一个属性会被继承两次(this.name...继承了父类自身的属性 继承了父类的原型属性(方法) 基于上面的问题,如果 Child.prototype 不指向 Parent的实例 new Parent(),而是指向 Parent.prototype...原型继承并不涉及到类,这里的对象都是继承自其他对象。...—— 浅复制 & 深复制 继承的目的是为了实现代码复用,所以一个对象要从另一个对象中获取功能,把目标对象的属性和方法复制过来也是一种方法。

2.5K10

面向对象之组合VS继承继承过时了?

那什么是组合组合相较于继承的优点在哪里,缺点又有哪些,组合继承更适合怎样的场景,更重要的是作者在校基础课程的学习中尽然都没有接触到组合这个概念,实在有理由探索一下!...联系 组合继承都是代码复用的一种方式 优点和缺点   在 Effective Java 中非常推荐在需要代码重用的情况下优先使用组合而不是大家常见的继承,让我们们他们各有什么优缺点 优点 组合 继承...,但是继承就没有用武之地么,让我们接下来看他们各自的使用场合和情况 不同的场景 我们通过最初的组合继承的示例代码再结合 概念中的 has - a 和 is -a 的描述,能够体会到组合继承是为了两种场景的重用而设计的...而除去第一种场景,其他场景使用组合是更合适的 并且在第一种场景中,使用组合也不是不可以,但继承是最好的方案 结语   文章至此处,想必大家已经明白了组合继承的关系,并且已经知道在何种情况下使用他们,那么组合...VS继承 的 结果就是在更多的场景中使用组合是更好的方案。

4.8K20

编程思想 之「继承组合、fianl」

提起「复用类」三个字,相信我们脑海中浮现的都是「组合」和「继承」,实际上,在 Java 中复用类的方法也确实是这两种。...继承 Java 用super关键字表示超类(或称之为基类)的意思,意味着:当前类是从超类中继承而来的。当我们创建一个继承超类的导出类的对象的时候,该对象就包含了一个超类的子对象。...组合 我们有一个设计原则,那就是:多用组合,少用继承。 相比于继承来说,组合更加灵活。组合通常用于想在新类中使用现有类的功能而非它的接口这种情形。...举一个简单的例子,如果我们想创建一个Car,而 1 个Car包含 4 个Wheel、4 个Door和 6 个Window,这显然是has-a的关系而不是is-a的关系,何况 Java 也不支持多继承,这时使用组合就显得尤为合理...类中所有的private方法都隐式地指定为final的;final类中所有的方法也都隐式指定为final的,因此final类无法继承,其方法也无法覆盖。

30820

JS进阶:继承

在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的new 到底是干什么的 一、什么是 JS 原型链 我们知道 JS 有对象,比如 var obj =...一般,初学者都知道前两种形式,而且认为前两种形式「优于」第三种形式,其实第三种才是正常调用形式: func.call(context, p1, p2) 其他两种都是语法糖,可以等价地变为 call 形式...缺点: 只能继承父类的实例属性和方法,不能继承原型属性/方法 无法实现复用,每个子类都有父类实例函数的副本,影响性能 3、组合继承 组合上述两种方法就是组合继承。...所以,组合模式的缺点就是在使用子类创建实例对象时,其原型中会存在两份相同的属性/方法。 4、原型式继承 利用一个空对象作为中介,将某个对象直接赋值给空对象构造函数的原型。...无法传递参数 6、寄生组合继承 结合借用构造函数传递参数和寄生模式实现继承 function inheritPrototype(subType, superType){ var prototype

4.4K10

C++:继承#2与组合

组合 类以另一个类对象作为数据成员的操作,称为组合,当两个类具有包含关系的时候,组合就比继承更能满足我们的要求,在思考如何选择组合继承的时候,就应该分析两个类之间的关系,组合的实现方式如以下代码片段...public: engine eng;//与engine类对象组合 }; void vehicleFn(vehicle& v); void engineFn(engine& e); int...c属于car类,car类并没有继承engine类,仅仅是与engine类对象组合 engine(c.eng);//ok,eng是engine类对象 return 0; } 继承#2 多继承的模糊性...这又会导致模糊性产生,计算机并不清楚你的操作是针对于哪一个 Electronics,我们只希望有一个 Electronics 拷贝,同时又要共享 gamePlayer 和 tool 的成员,C++ 将实现这种继承结构的方法成为虚拟继承...多继承的构造顺序 按从上到下的顺序进行构造: 虚拟基类的构造函数按照被继承的顺序进行构造; 非虚拟基类的构造函数按照被继承的顺序进行构造; 成员对象(组合)的构造函数按照声明顺序进行构造; 类本身的构造函数

29620

js实现继承

js实现继承 经典继承(原型链) 缺点:过多的继承了没用的属性 Grandfather.prototype.lastName = 'zhang' function Grandfather() {...,造成了不必要的继承 共享原型 本质:重写原型对象 优点:只会继承父的原型,不会继承父原本自带的属性或方法(只有调用new Father()才会继承自身的东西) 缺点:给本身的原型添加属性或方法时,会把继承的那个原型也修改了...son); // Son {money: 100, hobby: "game"} console.log(son.lastName); // undefined 组合继承...); // Son {money: 100, hobby: "game"} console.log(son.lastName); // zhang 圣杯模式(寄生组合继承...) 雏形 本质:重写原型对象 优点:只会继承父的原型,不会继承父原本自带的属性或方法(只有调用new Father()才会继承自身的东西) 缺点:1,这样继承后即使修改了son的原型也不会修改father

5.3K20
领券