面向对象编程讲究的是代码复用,继承和组合都是代码复用的有效方法。组合是将其他类的对象作为成员使用,继承是子类可以使用父类的成员方法。引用一个生动的比方:继承是说“我父亲在家里给我帮了很大的忙”,组合是说“我请了个老头在我家里干活”。
继承
在继承结构中,父类的内部细节对于子类是可见的。所以我们通常也可以说通过继承的代码复用是一种“白盒式代码复用”。
优点:
★简单易用,使用语法关键字即可轻易实现。
★易于修改或扩展那些父类被子类复用的实现。
缺点:
★编译阶段静态决定了层次结构,不能在运行期间进行改变。
★破坏了封装性,由于“白盒”复用,父类的内部细节对于子类而言通常是可见的。
★子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性。当父类的实现更改时,子类也不得不会随之更改。
组合
组合是通过对现有的对象进行拼装(组合)产生新的、更复杂的功能。因为在对象之间,各自的内部细节是不可见的,所以我们也说这种方式的代码复用是“黑盒式代码复用”。
优点:
★通过获取指向其它的具有相同类型的对象引用,可以在运行期间动态地定义(对象的)组合。
★“黑盒”复用,被包含对象的内部细节对外是不可见。不破坏封装,整体类与局部类之间松耦合,彼此相对独立。
★整体类对局部类进行包装,封装局部类的接口,提供新的接口,具有较好的可扩展性。
缺点:
★整体类不能自动获得和局部类同样的接口,比继承实现需要的代码更多。
★不熟悉的代码的话,不易读懂。
关于两者的选择
is-a关系用继承表达,has-a关系用组合表达。继承体现的是一种专门化的概念而组合则是一种组装的概念。
个人推荐:除非用到向上转型,不然优先考虑组合。
-------------------------------------------------------------
(声明:本文转自http://www.cnblogs.com/god_bless_you/archive/2011/02/17/1957009.html,特别感谢原作者的无私分享。)
分享到:
相关推荐
3. 组合继承:组合继承结合了原型链和借用构造函数两种方式,是JavaScript中最常用的继承方式。它使用原型链继承原型上的属性和方法,又通过借用构造函数继承实例属性,这样既保证了功能的完整,又能实现属性和方法...
本文主要探讨两种继承模式:寄生式继承和寄生组合式继承。 首先,寄生式继承是一种不直接修改原对象,而是通过创建其副本并在副本上进行增强的方法。这种方式避免了直接操作原对象可能导致的问题。例如,我们有一个...
在JavaScript中,有多种实现继承的方式,其中包括本文将探讨的两种主要技术:借用构造函数和组合式继承。 **借用构造函数(Constructor Stealing)** 借用构造函数,也称为伪造对象或经典继承,是一种通过在子类...
组合继承是原型链继承和构造函数继承的结合。它使用原型链实现方法的继承,同时又利用构造函数来继承父对象的属性。组合继承避免了子对象共享父对象引用类型属性的问题,同时也继承了父对象原型链上的方法。其主要...
本PPT学习教案深入浅谈了设计模式的基本概念和重要原则,同时介绍了几种创建型设计模式。 首先,设计模式产生的原因通常是因为代码的紧密耦合,如对特定类的依赖、硬件和软件平台的依赖、对象表示和实现的依赖等。...
"浅谈与AJAX相关的几种技术" 本文将对与AJAX相关的几种技术进行简单介绍,包括XHTML、CSS、XML、XSLT和DOM等。 首先,AJAX技术丰富的功能、交互性以及快速的响应能力受到人们广泛青睐,但实际上AJAX是多种老技术的...
浅谈JavaScript对象之教学 本文旨在探讨JavaScript对象的教学要点,旨在帮助高职软件技术专业的学生更好地理解和掌握JavaScript语言。文章从对象的概念、使用原生对象、原型链的理解、自定义对象的创建和新的语法...
原型链是JavaScript实现继承的机制,它允许一个对象访问另一个对象的属性和方法。继承是指新创建的对象可以继承其原型对象的属性和方法。下面详细探讨这两个概念。 **原型链** 在JavaScript中,每个对象都有一个...
类图是UML中最基本的元素之一,它展示了类与类之间的关系,如继承、关联、聚合和组合等。序列图和协作图则关注对象间的交互顺序和同步,状态图描绘了对象在其生命周期内的行为,活动图则更专注于流程和工作流的表示...
孟德尔第一定律,也称为基因别离定律,指出在一对相对性状中,每个个体都含有两个遗传因子,这两个因子在形成配子时会随机别离,使得后代有50%的概率继承每一个因子。例如,纯种高茎豌豆与纯种矮茎豌豆杂交,子一代...
在《设计模式浅谈24种》中,主要讨论了24种经典的GOF设计模式,这些模式被分为三大类:创建型、结构型和行为型。 创建型模式主要关注对象的创建,包括以下几个核心模式: 1. **Abstract Factory**(抽象工厂)模式...
在JavaScript中,对象是语言的核心组成部分,它们是数据和功能...总的来说,JavaScript的对象和继承机制使得动态创建和组合数据结构以及实现面向对象编程成为可能。理解这些概念对于编写高效的JavaScript代码至关重要。
这时候,可能会使用到组合而非继承的设计模式。 文章提到,isinstance()函数还支持将类信息参数作为元组的形式,这时,isinstance()会递归地调用自身来检查实例是否匹配元组中的任何一个类。 在分析源码的过程中,...
总的来说,`phpunit`和`selenium`的组合为PHP开发者提供了一个强大的测试工具链,能够有效地提升软件的质量和稳定性。然而,由于涉及到多个组件的集成和配置,初学者可能会遇到一些挑战,但随着实践和学习的深入,...
实现Struts2拦截器需要继承`com.opensymphony.xwork2.interceptor.Interceptor`接口并实现其中的三个方法:`init()`、`destroy()`和`intercept()`。`init()`方法在程序启动时调用,`destroy()`在程序关闭时调用,而...