《面向对象程序设计方法》由会员分享,可在线阅读,更多相关《面向对象程序设计方法(37页珍藏版)》请在金锄头文库上搜索。
1、第3章 面向对象程序设计方法面向对象方法与结构化方法u结构化程序设计方法的主要技术是自顶向下,逐步求精, 采用单入口/单出口的控制结构。u面向对象程序设计建立在结构化程序设计基础上,最重要 的改变是程序围绕被操作的数据来设计,而不是围绕操作 本身。u结构化程序设计方法在解决中等复杂问题时表现了卓越的 性能,但随着程序规模与复杂度的增加及软件行业的产业 化,程序中数据结构与这些数据的操作同样重要,面向对 象的程序设计方法逐渐展示其生命力,成为人们普遍看好 的软件问题解决方案。u面向对象程序设计与结构化程序设计是解决问题两种不同 的思维方式,在程序设计技术迅速发展的今天,两种方法 和语言都必须掌握
2、。面向对象程序设计方法学主要内容n为什么需要面向对象n面向对象程序设计方法的基本概念n面向对象程序设计方法的起源n面向对象计算的基本原理n面向对象程序设计的基本原则n面向对象程序设计的一般方法n应用框架n设计模式3.1为什么需要面向对象u实践中人们认识到重用已有开发结果的重要性, 提出了软件重用的概念。u重用中有一种常见情况:软件开发中遇到的新问 题常常与解决过的问题(重用库提供的功能)类 似,但又不完全相同。已有模块的功能与需要有差异,就不能以其“现有”形式 直接使用。模块功能的修改只能通过修改源代码的方式进行,程序 员就只能拷贝这个模块的源代码,深入研究后设法修改 之。3.1为什么需要面向
3、对象u面向对象的方法和程序技术,为基于模块(一个 类也可以看作一个模块)的重用问题提供了一条 解决途径。面向对象技术的最重要能力,是使程序员比较容易以 外部附加的方式,在原有抽象的基础上定义新的数据 抽象。容易定义一些操作的框架,使新的数据抽象可以使用 这些框架,并把针对该类抽象的实例的具体操作插入 框架中(重用和调整)。3.2基本概念封装(encapsulation)信息/实现的隐藏(information/implementation hiding )对象标识(object identity)消息(message)类(class)继承(inheritance)多态性(polymorphis
4、m)接口(interface)3.2基本概念u封装,将属性和操作包装成一个单元,使得对状 态的访问和修改只能通过封装提供的接口进行。u信息/实现的隐藏,将某些属性或方法限制在封 装内部使用,限制外部的可见性。u对象标识,每个对象可以作为软件实体被标识和 处理,每个对象都有一个对象标识符(object identifier, OID)。u消息,对象间发送请求的载体。u接口,一组没有公共代码的对象共享实现。3.2基本概念u类,类是对象的类型(模板),对象是类的实例 。u继承,子类隐式使用超类(或父类)的属性和操 作。u多态性,子类覆盖(overriding)父类的方法。 它和重载(overload
5、ing)的区别在于重载是在同 一对象层次中,利用参数的不同来进行动态绑定 (dynamic binding)。3.3面向对象程序设计方法的起源1.符号抽象Backus1957 的Fortran实现使用了人们习惯的符号记法,而且确保了编译后的运行效率。2.过程抽象C语言的发展使函数概念得到了普及和大规模应用。一些相对完整的功能代码被封装在一个函数里面实现。3.信息隐藏和抽象数据类型 Wirth1980的Modula-2语言实现了模块,不降低运行效率的情况下实现了信息隐藏和抽象数据类型。 3.3面向对象程序设计方法的起源4.类型抽象挪威计算中心的Kristen Nygaard和Ole-Johan
6、Dahl开 发了Simula67语言;70年代中期,Xerox Palo Alto研究中心开发了 Smalltalk语言; 这些语言用类、对象、重载、动态绑定技术实 现了抽象数据类型,但是其运行效率不能让人 满意,其抽象类型概念也不能让人接受,直到 C和C+3.4面向对象计算的基本原理面向对象的抽象原理u数据抽象原理数据抽象提供了面向对象方法的始点,其核心就 是实现了模块化与信息隐藏,同时它也是面向对 象方法学的基础。 u行为共享原理 行为共享是指许多实体具有相同的接口,将不同 实体的相同操作定义为抽象的操作,从而给用户 带来方便。面向对象的抽象原理u进化原理进化包括两种含义:一是指系统随需求
7、变化而修改和增加的情况;二是指对复杂问题的增量式的求解过程。 进化建议面向对象对修改封闭,对增加开放。 u正确性原理 正确性的问题主要是由行为共享所导致的, 当一个实体请求另外一个实体的某种行为时候, 系统必须确保能够在共享的行为组中找到正确的 行为实现并运行它 。面向对象计算的基本原理面向对象计算模型是指对上述面向对象抽象原 理的具体实现技术,大部分面向对象语言使用如下 三类技术:1.封装封装实现了数据抽象技术 2.分类 分类是实现行为共享的基础 A 集合B 抽象数据类型C 类面向对象计算的基本原理3.共享 共享技术用于实现行为共享和进化原理。在面 向对象语言系统中,共享又统称为多态性。 多
8、态性表明一个对象可以属于多于一个的分 类,这样,就有可能让两个不同的分类共享相同的 行为。 多态性通用的特定的参数化多态包含多态重载强制多态强制多态预先规定了语言中各种类型之间的映射关系,是一种隐 式做类型转换的方法。(类型强制转换) 例如:2.0 + 2.0、2.0 + 2、2.0 + “2“重载允许一个函数名使用多次,每次带有不同的参数,例如 print(PrintWriter)和print(FileWriter),同样的命名使得程序容易设计 和理解。 强制和重载合起来被称为特定的多态性,因为两者都用于特定 的目的,还有两种多态用于比特定多态更加基础的形式。 多态性多态性通用的特定的参数化
9、多态包含多态重载强制多态参数化多态性 所谓参数化多态性,是指将一段程序所处理 的对象的类型参数化,这样,这段程序就可以处理某个类型 范围之内的各种类型的对象,这些类型呈现某种共同的结构 。 多态性多态性通用的特定的参数化多态包含多态重载强制多态n包含多态性 是一种强调分类之间关系的程序设计风格,一种分类 可以替代一种分类,分类之间不再孤立,分类之间体现了继承关系 。n通常期望面向对象的语言应该具有包含多态性的特征,因为它是 一种很好的实现自底向上的设计工具。n另外一种观点则认为目前对继承关系的滥用破坏了面向对象思想 的优秀性,应该在面向对象程序中放弃继承,通过其它的方式实现 行为共享原理。多态
10、性3.5一些面向对象的设计原则1.开闭原则(OCP)2.里氏代换原则(LSP)3.依赖倒转原则(DIP)4.接口隔离原则(ISP)5.合成聚合复用原则(CARP)6.迪米特法则(LoD)7.单责任原则(SRP)1 开闭原则(OCP)n开闭原则是面向对象程序设计的第一原则,这个原则 最早由Bertrand Meyer提出。n内容:“Software entities should be open for extension,but closed for modification”,即一个软件实 体应该对扩展开放,对修改关闭。n含义是:当一个软件需要增加或者修改某些功能的时 候,应该尽可能的只是在
11、原来的实体中增加代码,而不 是修改代码。n作用:开闭原则保证了系统具有一定的稳定性,同时 保证了系统的灵活性。n开闭原则的另外一个叫法称为“对可变性的封装原则 ”。 1 开闭原则(OCP)计算部件数组中各个 部件价格的总和。 若财务部颁布主板和内存应使用额外费用, 则需修改如下: 1 开闭原则(OCP)1 开闭原则(OCP)较好的一种设计方式是:将计价策略合并到Part的 getPrice()方法中。Part和ConcretePart类的示例如下: 2 里氏代换原则(LSP)里氏代换原则最早由Barbara Liskov提出: “基类出现的地方,子类一定可以出现”,也 就是对基类是合法的操作,
12、对子类也一定合法 。正方形是否是长方形的子类? 里氏代换原则( LSP)public class Rectangle long width;long height;public void setWidth(long width)this.width = width;public long getWidth()return width;public void setHeight(long height)this.height = height;public long getHeight()return height; 长方形类里氏代换原则 (LSP)public class Square ext
13、ends Rectangle public void setWidth(long width)this.width = width;this.height = width;public long getWidth()return width;public void setHeight(long height)this.width = height;this.height = height;public long getHeight()return height; 正方形类一个Rectangle对象的合法操作,对Square却非法! public void resize(Rectangle r)
14、 while(r.getHeight() 声明其中:template 是关键字。当声明函数模板时,“声明”是一个函数声明;当声明一个类模板时 ,“声明”是一个类声明。“模板参数表”是由下列形式的表项构成的一个列表 class 标识符 类型表达式 标识符 ( 中的“标识符”代表“声明”定义的类或函数所参数化 的类型; 中的“标识符”则代表“声明”定义的类所参数化 的常量,“类型表达式”规定了常量的类型。) 例2: template class CArray T buf N ;public:void Print ( ); ;包含多态性 u在C+语言中,包含多态是从类的公有继承和子 类型的概念导出的概念,指对类T子类型化得到子 类S,使一个程序段既能够处理类型T的对象,也 能够处理类型T的子类型S的对象。uC+中采用虚拟函数来实现包含多态,虚拟函数 为C+提供了更为灵活的多态机制,这种多态性 在程序运行时才能确定,因此虚拟函数是多态性 的精华,至少含有一个虚拟函数的类称为多态类 ,使得包含多态在程序设计中使用十分频繁。