面向对象技术的概念与方法

面向对象技术的概念与方法
面向对象技术的概念与方法

面向对象技术的概念与方法1面向对象的基本概念

本节着重介绍面向对象的基本概念,也对相应的面向对象的技术方法的一些基本概念和方法做些说明和解释。

1.1 面向对象方法学的基本原则

面向对象方法学认为:客观世界是由各种“对象”所组成的,任何事物都是对象,每一个对象都有自己的运动规律和内部状态,每一个对象都属于某个对象“类”,都是该对象类的一个元素。复杂的对象可以是由相对比较简单的各种对象以某种方式组成的。不同对象的相互作用就构成了我们要研究、分析和构造的客观系统。

面向对象方法学认为:通过类比,发现对象间的相似性,即对象间的共同属性,这就是构成对象类的根据。

面向对象方法学认为:对于已分成类的各个对象,可以通过定义一组“方法”来说明该对象的功能,也即是:允许作用于该对象上的各种操作。对象间的相互联系是通过传递“消息”来完成的。

面向对象方法学比较自然地模拟了人类认识客观世界的方法。即应使描述问题的问题空间和解决问题的方法空间在结构上尽可能地一致。我们分析、设计和实现一个系统的方法尽可能接近我们认识一个系统的方法。

1.2 对象

面向对象技术是基于对象概念的。在现代汉语词典中,对象是行动或思考时作为目标的人或事物。

在思维科学中,对象是客观世界中具有可区分性的、能够唯一标识的逻辑单元。对象所代表的本体可能是一个物理存在,也可能是一个概念存在。

“面向对象”是计算机科学中的一个技术名词,具有其特定的技术含义。从面向对象的观点来看,现实世界是由各式各样独立的、异步的、并发的实体对象组成,每个对象都有各自的内部状态和运动规律,不同对象之间或某类对象之间的相互联系和作用,就构成了各式不同的系统。

面向对象方法是基于客观世界的对象模型化的软件开发方法。在面向对象程序设计中,所谓对象,就是一个属性集及其操作的封装体。作为计算机模拟真实

世界的抽象,一个对象就是一个实际问题论域,一个物理的实体或逻辑的实体。在计算机程序中,可视为一个“基本程序模块”,因为它包含了数据结构和所提供的相关操作功能。

我们把客观世界的实体称之为问题空间的对象,任何事物都是对象。我们用计算机解题是借助某种语言规定对计算机实体施加某种动作,以此动作的结果去映射解,我们把计算机实体称之解空间的对象。在面向对象的程序设计中,“对象”是系统中的基本运行实体。即对象是具有特殊属性(数据)和行为方式(方法)的实体。

从动态的观点看,对象的操作就是对象的行为。问题空间对象的行为是极其丰富的,而解空间对象的行为是极其死板的。因此,只有借助于极其复杂的算法才能操纵解空间对象而得到解。面向对象语言提供了“对象”概念,这样,程序员就可以定义解空间对象。从存储的角度来看,“对象”是一片私有存储,其中有数据也有方法。其它对象的方法不能直接操纵该对象的私有数据,只有对象私有的方法才可以操纵它。从对象的实现来看,“对象”是一台自动机,其中私有数据表示了对象的状态,该状态只能由私有的方法改变它。每当需要改变对象的状态时,只能由其它对象向该对象发送消息,对象响应消息后按照消息模式找出匹配的方法,并执行该方法。

对象的属性是指描述对象的数据,可以是系统或用户定义的数据类型,也可以是一个抽象的数据类型,对象属性值的集合称为对象的状态。

对象的行为是定义在对象属性上的一组操作方法的集合。方法是响应消息而完成的算法,表示对象内部实现的细节,对象的方法集合体现了对象的行为能力。

对象的属性和行为是对象定义的组成要素,有人把它们统称为对象的特性。一般具有以下特征:

(1)具有一个状态,由与相关联的属性值集合所表征。

(2)具有唯一标识名,可以区别于其他对象。

(3)有一组操作方法,每个操作决定对象的一种行为。

(4)对象的状态只能被自身的行为所改变。

(5)对象的操作包括自操作和它操作

(6)对象之间以消息传递的方式进行通信。

(7)一个对象的成员仍可以是一个对象。

其中,前3 条是对象的基本特征,后4条是属于特征的进一步定义说明。

有的书上又这样写关于对象的特征:

(1)模块性:一个对象是一个可以独立存在的实体。从外部看这个模块,只了解这个模块具有哪些功能,模块的内部状态以及如何实现这些功能的细节都是“隐蔽”在模快的内部的。

(2)继承性和类比性:人们是通过对客观世界中的各种对象进行分类及合并等方法来认识世界的,每个具体的对象都是在它所属的某一类对象(类)的层次结构中占据一定的位置。下一层次的对象继承了上一层次对象的某些属性。另一方面,不同的对象具有某些相同的属性时,也常常把它们归并成一类。

(3)动态连接性:我们把对象和对象间所具有的统一、方便、动态地连接和传递消息的能力与机制称之为动态连接性。

(4)易维护性:在面向对象系统中,人们的注意力集中于具有相同特性的一类对象,抽象出这样一类对象共同的结构和行为,进行一般描述,从而避免数据的冗余。“物以类聚”,分类、类比、类型、同类,等等,是人们归纳客观事物的方法。

1.3 类

类是对象的抽象及描述,是具有共同属性和操作的多个对象的相似特性的统一描述体。类也是对象,是一种集合对象,称之为对象类,简称为类,以有别于基本的实例对象。

在类的描述中,每个类要有一个名字,要表示一组对象的共同特征,还必须给出一个生成对象实例的具体方法。类中的每个对象都是该类的对象实例,即系统运行时通过类定义属性初始化可以生成该类的对象实例。实例对象是描述数据结构,每个对象都保存其自己的内部状态,一个类的各个实例对象都能理解该所属类发来的消息。类提供了完整的解决特定问题的能力,因为类描述了数据结构(对象属性)、算法(方法)和外部接口(消息协议)。

类由方法和数据组成,它是关于对象性质的描述,包括外部特性和内部实现两个方面。类通过描述消息模式及其相应的处理能力来定义对象的外部特性,通

过描述内部状态的表现形式及固有处理能力的实现来定义对象的内部实现。一个类实际上定义的是一种对象类型,它描述了属于该类型的所有对象的性质。

对象是在执行过程中由其所属的类动态生成的,一个类可以生成多个不同的对象。同一个类的对象具有相同的性质。一个对象的内部状态只能由其自身来修改。因此,同一个类的对象虽然在内部状态的表现形式上相同,但可有不同的内部状态。从理论上讲,类是一个抽象数据类型的实现。

一个类的上层可以有超类,下层可以有子类,形成一种类层次结构。这种层次结构的一个重要特点是继承性,一个类继承其超类的全部描述。这种继承具有传递性。所以,一个类实际上继承了层次结构中在其上面的所有类的全部描述。因此,属于某个类的对象除具有该类所描述的特性外,还具有层次结构中该类上面所有类描述的全部特性。

抽象类是一种不能建立实例的类。抽象类将有关的类组织在一起,提供一个公共的根,其它的子类从这个根派生出来。抽象类刻画了公共行为的特性并将着些特征传给它的子类。通常一个抽象类只描述与这个类有关的操作接口,或是这些操作的部分实现,完整的实现被留给一个或几个子类。抽象类已为一个特定的选择器集合定义了方法,并且有些方法服从某种语义,所以,抽象类的用途是用来定义一些协议或概念。

综上所述,类是一组对象的抽象,它将该种对象所具有的共同特征集中起来,由该种对象所共享。在系统构成上,则形成了一个具有特定功能的模块和一种代码共享的手段。

在一个有效率的面向对象系统中,是没有完全孤立的对象的,对象的相互作用的模式是采用消息传送来进行的。

1.4 消息

消息是面向对象系统中实现对象间的通信和请求任务的操作。消息传递是系统构成的基本元素,是程序运行的基本处理活动。

一个对象所能接受的消息及其所带的参数,构成该对象的外部接口。对象接受它能识别的消息,并按照自己的方式来解释和执行。一个对象可以同时向多个对象发送消息,也可以接受多个对象发来的消息。消息只反映发送者的请求,由于消息的识别、解释取决于接受者,因而同样的消息在不同对象中可解释成不同

的行为。

对象间传送的消息一般由三部分组成,即接受对象名、调用操作名和必要的参数。在C++中,一个对象的可能消息集是在对象的类描述中说明,每个消息在类描述中由一个相应的方法给出,即使用函数定义操作。向对象发送一个消息,就是引用一个方法的过程。实施对象的各种操作,就是访问一个或多个在类对象中定义的方法。

消息协议是一个对象对外提供服务的规定格式说明,外界对象能够并且只能向该对象发送协议中所提供的消息,请求该对象服务。在具体实现上,是将消息分为公有消息和私有消息,而协议则是一个对象所能接受的所有公有消息的集合。

前面讲过,对象间的相互联系是通过传递消息来实现的。消息用来请求对象执行某一处理或回答某些信息的要求,消息统一了数据流和控制流,程序的执行是靠在对象间传递消息来完成的。发送消息的对象称为发送者,接受消息的对象称为接受者。消息中只包含发送者的要求,消息完全由接受者解释,接受者独立决定采用什么方式完成所需的处理。一个对象能接受不同形式不同内容的多个消息,相同形式的消息可以送往不同的对象,不同的对象对于形式相同的消息可以有不同的解释,能够做出不同的反映。对于传来的消息,对象可以返回响应的回答信息,但这种返回并不是必修的。

消息的形式用消息模式刻画,一个消息模式定义了一类消息,它可以对应内容不同的消息。对于同一消息模式的不同消息,同一个对象所做的解释和处理都是相同的,只是处理的结果可能不同。对象固有处理能力按消息分类,一个消息模式定义对象的一种处理能力。所以,只要给出对象的所有消息模式及相应于每一个模式的处理能力,也就定义了一个对象的外部特征。消息模式不仅定义了对象所能受理的消息,而且还定义了对象的固有处理能力。

2.方法

把所有对象分成各种对象类,每个对象类都定义一组所谓的“方法”,它们实际上可视为允许作用于各对象上的各种操作。

2.1 封装性

在上述面向对象的基本概念的基础上,将就所有面向对象程序设计都具有的

3个共同特性进行分析说明,使我们对面向对象的概念和原理能够有进一步的认

识和理解

封装是一种信息隐蔽技术,用户只能见到对象封装界面上的信息,对象内部对用户是隐蔽的。封装的目的在于将对象的使用者和对象的设计者分开,使用者不必知道行为实现的细节,只需用设计者提供的消息来访问该对象。

封装性是面向对象具有的一个基本特性,其目的是有效地实现信息隐藏原则。这是软件设计模块化、软件复用和软件维护的一个基础。

封装是一种机制,它将某些代码和数据链接起来,形成一个自包含的黑盒子(即产生一个对象)。一般地讲,封装的定义为:

(1)一个清晰的边界,所有的对象的内部软件的范围被限定在这个边界内。封装的基本单位是对象;

(2)一个接口,这个接口描述描述该对象与其他对象之间的相互作用;

(3)受保护的内部实现,提供对象的相应的软件功能细节,且实现细节不能在定义该对象的类之外。

面向对象概念的重要意义在于,它提供了较为令人满意的软件构造的封装和组织方法:以类/对象为中心,既满足了用户要求的模块原则和标准,又满足代码复用要求。客观世界的问题论域及具体成分,在面向对象系统中,最终只表现为一系列的类/对象。

对象的组成成员中含有私有部分、保护部分和公有部分,公有部分为私有部分提供了一个可以控制的接口。也就是说,在强调对象的封装性时,也必须允许对象有不同程序的可见性。可见性是指对象的属性和服务允许对象外部存取和引用的程度。

面向对象程序设计技术鼓励人们把问题论域分解成几个相互关联的子问题,每个子类都是一个自包含对象。一个子类可以继承父类的属性和方法,还可以拥有自己的属性和方法,子类也能将其特性传递给自己的下一级子类,这种对象的封装、分类层次和继承概念,与人们在对真实世界认识的抽象思维中运用聚合和概括相一致。

面向对象的语言以对象协议或规格说明作为对象的外界面。协议指明该对象所接受的消息,在对象的内部,每个消息响应一个方法,方法实施对数据的运算。对数据方法的描述是协议的实现部分或叫类体。

显式地将对象的定义和对象的实现分开是面向对象系统的一大特色。封装本身即模块性,把定义模块和实现模块分开,就使得用面向对象技术所开发设计的软件的维护性、修改性在为改善。

2.2 继承性

继承性是面向对象技术中的另一个重要概念和特性,它体现了现实中对象之间的独特关系。既然类是对具体对象的抽象,那么就可以有不同级别的抽象,就会形成类的层次关系。若用结点表示类对象,用连接两结点的无向边表示其概括关系,就可用树形图表示类对象的层次关系。继承关系可分为以下几种:一代或多代继承、单继承和多继承。子类仅对单个直接父类的继承叫做单继承。子类对多于一个的直接父类的继承叫多继承。

就继承风格而言,还有全部继承、部分继承,等等。一般的面向对象系统,在不同程度上支持如下四种类型的继承:

(1)替代继承,如果能够对类T的对象比类E的对象实施更多的操作,就说类T继承类E,即在类E的对象处能够用类T的对象来替代。这种继承是基于方法而非值。

(2)包含继承,如果类T的每个对象也是类E的对象,则说类T是类E的子对象。这种继承是基于结构而非操作。

(3)限制继承,如果类E包括满足某种已知限定条件的类T的所有对象,则类T是类E的一个子类。这是包含继承的特殊情形。

(4)特化继承,如果类E的对象是类T的对象,而T带有更多特殊信息,则类T是类E的子类。

继承性允许程序设计人员在设计新类时,只须考虑与父类所不同的特性部分,而继承父类的内容为自己的组成部分。如果父类中某些行为不适用于子类,则程序设计人员可在子类中重写方法的实现。因此继承机制不仅除去基于层次联系的类的共性的重复说明,提高代码复用率,而且能使开发者的大部分精力用于系统中新的或特殊的部分设计,便于软件的演进和增量式扩充。

继承性是自动的共享类、子类和对象中的方法和数据的机制。

每个对象都是某个类的实例,一个系统中类对象是各自封闭的。如果没有继承机制,则类对象中数据和方法就可能出现大量的重复。

继承性是实现从可重用成分构造软件系统的最有效的特征,它不仅支持系统的可重用性,而且还促进系统的可扩充性。

2.3 多态性

面向对象技术的第3个特性是多态性。多态性原意是指一种具有多种形态有事物,这里是指同一消息为不同的对象所接受时,可导致不同的行为。多态性支持“同一接口,多种方法”,使重要算法只写一次而在低层可多次复用。面向对象的多种多态性方法的使用,如动态绑定、重载等,提高了程序设计的灵活性和效率。

所谓多态即一名字可具有多种语义。在面向对象的语言中,多态引用表示可引用多个类的实例。由于多态具有可表示对象的多个类的能力,因而,它既与动态类型有关又与静态类型有关。

在C++中,利用多态性概念,使用函数名和参数类别来实现功能重载,即使用不同参数就可以使之同各个对象相结合,分别实现相应的任务。

3.常用术语简释和定义

从面向对象方法学原理出发,对上述的有关术语可以进一步地做如下的简要释义:

信息:是对事物的一种表示和描述。

软件:是描述信息处理的信息。

对象:是一个由信息及有关对它进行处理的描述所组成的包。对象可以定义如下:OBJ::=。其中ID是对象标识或名称;DS是属性数据;MS是对象受理的操作集合(方法);MI是对象处理的消息集。

消息:是对某种对象处理的说明。消息可以定义为MSG::=。其中MN是消息名;ARG是变元组。

类:是对一个或几个相似对象的描述;类可以定义为一个四元组:CLS::=其中,ID是类的标识或称为名字;INH是类的继承性描述;DD是属性数据;OP是操作集合,即方法集;ITF是统一的对外接口或协议。

继承是类的特性,即子类可以继承父类的特性。可用一个偏序关系定义继承的特性:INH==)。其中,C为处于继承链上所有的类,>=表示继承关系继承是有传递性的,即IF(C2,>=C1)&(C3>=C2) THEN C3>=C1 。在对继承作了以上

定义后,还可以对类作重新的定义。

类n::=<类n的ID,∪类i本身的数据结构描述,∪类i本身的操作实现,∪类i本身的对外接口>(i=1,2,…,n)。其中类1到类n是属于同一类链的,且,类i继承类i+1的特性。

元类:当某个类的单个实例本身就是一个类时,这个类就称为元类。

子类:是在共享其他类的描述后,再对这个描述做某些修改而构成的类。

实例:是被某个类所描述的对象中的一个具体对象。对象实例可以定义为一个三元组:OB::=。其中,OID是对象名或标识;ODY是对象实例的描述;CID是对象所属类的标识。

方法:是关于对象在接受到消息后所采取的一系列操作的描述,是对象对消息的响应。

方法字典:是消息选择符和方法之间的一个相联集合。

面向对象方法:是一种运用对象、类、消息传递、继承、封装、聚合、多态性等概念来构造软件系统的软件开发方法。

4.概念内涵的区别

在面向对象的基本概念中,有两对表达形式相似而内涵不同的术语,在此也做一些比较和说明。

类型:在面向对象系统中,类型概括了具有相同特性的一组对象的特征,是抽象数据类型的概念。它由接口和实现两部分组成,接口对用户是可见的,而实现部分只有设计人员可见。接口部分包括一组操作及用法说明,实现部分数据(是对象内部结构的描述)和操作(实现接口部分的过程)。C++等系统是支持类型概念的。

类:类的说明与类型相同,但概念上有所不同,类以方法表现出其动态性,并且包含了“对象生成器”和“对象存储器”的概念。

“类型”在常规程序设计语言中的作用主要体现在数据描述上,作为保证程序正确性检查和提高程序效率的工具。而类的作用在于作为模拟手段,以统一的方式构造现实世界模型,因而提高属于系统的最高层,并且可在运行时刻操作。

关于消息传递和过程调用,形式上相似,但有3点本质不同:

(1)消息传递必须给出关于通道信息,即要显示地指明接受方,而过程调

用的信道则是隐含的,其适用范围取决于变元;

(2)消息传递接受方是一实体,具有保持状态的能力,而过程调用则没有此要求;

(3)消息传递可以是异步的,因而是并发的,过程调用的本质是串行的。

5. 小结

1、面向对象方法在处理复杂问题时的基本原则

(1)对所研究的系统在不同的层次上抽象为一些对象,及用互通“消息”的方法在对象间进行联系。

(2)对用户提供对象外特性的描述,而隐蔽基内部的实现细节。

(3)下一层次的对象可自动继承一上层次对象的某些特性。

(4)在处理复杂问题时,应特别注意各个对象间的共性和异性,这是对问题归纳或演绎的依据。

2、面向对象方法提供了统一的表示范式

(1)从系统设计者的角度来看,希望对各种系统的问题域描述,对系统内各组成部分的功能和数据描述,以及对于系统对外接口的描述都有统一的表示范式。

(2)从系统分析者和系统实现者的角度来看,希望用于系统分析的表示范式和用于系统设计的表示范式应尽可能一致。

(3)从用户和设计者的角度来看,希望能相互理解,能逐步地和同步地明确需求和实现系统,尽量少用“瀑布”模型的设计流程,即必须当前一步的要求提得十分明确时,才进行下一步的工作。

(4)从OOA到OOD到OOP,都力求使用统一的表示范式。

3、用面向对象方法分析系统的一般过程

(1)研究的是什么问题,属于哪个问题域。

(2)调查、询问、收集材料、考查以往的结果。

(3)分析该问题在整个系统中的位置,它和上下层次的关系。

(4)根据所要研究问题的层次、详略,抽象出一些对象及对象间的联系,完成问题的结构描述。

4、用面向对象的方法设计系统的一般过程

(1)定义对象的属性及描述。

(2)每个对象和其类的关系

(3)定义对象间的通信机制。

(4)确定每个对象的状态。

5、用面向对象的方法进行程序设计

(1)用面向对象的程序设计语言、工具(环境)实现OOA及OOD的结果,实现对象的内部的机理和细节。

(2)用面向对象的快速原型法对系统进行优化。

(3)大量提高软件的可重用性。

面向对象的设计方法与C++编程

北京邮电大学200X-200X学年第一学期 《面向对象的设计方法与C++编程》期末考试试卷+扩展+复习题 试题一:填空题(没空一分,共20分) 请在括号内填入你认为正确的内容。 1.软件工程是指导(计算机软件)开发和维护的(工程学科)。 2.应用软件工程方法开发软件系统的根本目的是为了改善下述四项软件品质因素: 提高所开发的软件系统的(效率); 降低所开发的软件系统的(成本); 改善所开发的软件系统的(质量); 缩短所开发的软件系统的(开发周期)。 3.抽象的对象模型由(属性)和(方法)两个部分构成。 4.一个消息必须具备的两个要素是(接受消息的对象标识)和(接受消息的对象的方 法标识)。 5.一个对象拥有另一个对象的(部分)或(全部)的属性和方法的关系则称为(继 承)关系。 6.失去(创建具体对象实例的(制造对象))能力的类成为抽象类。 7.一个类的属性不能出现对象拷贝则被称为(类属性)。 8.面向对象技术的三大特征是(封装)、(继承)和(多态)。 9.共生包容关系中的被包容类对象与包容类对象是(同时连带)生成的。 10.同时出现在两个具有关联关系的对象内的相同属性被称为(连接属性)。 课程复习--补充题: 1.软件的生存周期是一个软件产品从(定义)、(开发)、(使用)到(废弃)的时 间的总合。 2.C++语言中的静态成员函数是(类方法)的具体实现。 3.连接属性是(关联/链接)关系的两个对象内的属性。 4.边界类与(actor(角色))对呈一一对应关系。 5.复合聚合关系中的(聚合)类对象极其依赖(被聚合)类对象,在实现上往往具有 被同时(构造)的特征,因而具有极高的(耦合度)。 试题二:是非判断题(每题1分,共20分) 请在题后的括号内填入√(你认为正确时)或×(你认为错误时)。 1.消息必须含有返回信息。(错) 2.一个类必然具有生成对象的能力。(错)(抽象类不具备) 3.在包容关系中的被包容类也具有封装性。(对) 4.关联关系只是一个动作的抽象。(错) (表示两个类之间的联系,通过这种联系,一个类可以访问到另外一个类的属性和方法。) 5.一个类也可以接收消息。(对) 6.关联关系中的作用名标识了该关联关系的终点对象的恰当地位。(对)

1.2 面向对象的基本概念

1.2 面向对象的基本概念 本节着重介绍面向对象的基本概念,也对相应的面向对象的技术方法做些说明和解释。 面向对象方法学的基本原则 面向对象方法学认为:客观世界是由各种“对象”所组成的,任何事物都是对象,每一个对象都有自己的运动规律和内部状态,每一个对象都属于某个对象“类”,都是该对象类的一个元素。复杂的对象可以是由相对比较简单的各种对象以某种方式组成的。不同对象的相互作用就构成了我们要研究分析和构造的客观系统。 面向对象方法学认为:通过类比,发现对象间的相似性,即对象间的共同属性,这就是构成对象类的根据。 面向对象方法学认为:对于已分成类的各个对象,可以通过定义一组“方法”来说明该对象的功能,也即是:允许作用于该对象上的各种操作。对象间的相互联系是通过传递“消息”来完成的。 面向对象方法学比较自然地模拟了人类认识客观世界的方法。即应使描述问题的问题空间和解决问题的方法空间在结构上尽可能地一致。我们分析设计和实现一个系统的方法尽可能接近我们认识一个系统的方法。 1.2.1 对象、类、消息 面向对象技术是基于对象(object )概念的。下面介绍对象概念。 在现代汉语词典中,对象是行动或思考时作为目标的人或事物。 在思维科学中,对象是客观世界中具有可区分性的、能够唯一标识的逻辑单元。对象所代表的本体可能是一个物理存在,也可能是一个概念存在。 “面向对象”是计算机科学中的一个技术名词,具有其特定的技术含义。从面向对象的观点来看,现实世界是由各式各样独立的、异步的、并发的实体对象组成,每个对象都有各自的内部状态和运动规律,不同对象之间或某类对象之间的相互联系和作用,就构成了各式不同的系统。 面向对象方法是基于客观世界的对象模型化的软件开发方法。在面向对象程序设计中,所谓对象,就是一个属性(数据)集及其操作(行为)的封装体。作为计算机模拟真实世界的抽象,一个对象就是一个实际问题论域,一个物理的实体或逻辑的实体。在计算机程序中,可视为一个“基本程序模块”,因为它包含了数据结构和所提供的相关操作功能。 我们把客观世界的实体称之为问题空间的对象,任何事物都是对象。 我们用计算机解题是借助某种语言规定对计算机实体施加某种动作,以此动作的结果去映射解,我们把计算机实体称之解空间的对象。 在面向对象的程序设计中,“对象”是系统中的基本运行实体。即对象是具有特殊属性(数据)和行为方式(方法)的实体。 从动态的观点看,对象的操作就是对象的行为。问题空间对象的行为是极其丰富的,而解空间对象的行为是极其死板的。因此,只有借助于极其复杂的算法才能操纵解空间对象而得到解。面向对象语言提供了“对象”概念,这样,程序员就可以定义解空间对象。 从存储的角度来看,“对象”是一片私有存储,其中有数据也有方法。其它对象的方法

软件工程 第八章 面向对象的设计方法

第八章面向对象的设计方法 本章采用基于UML的面向对象设计方法的将分析模型转换为设计模型。如第五章所述,面向对象的分析模型主要由顶层架构图、用例与用例图、领域概念模型构成;设计模型则包含以包图表示的软件体系结构图、以交互图表示的用例实现图、完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图等。为完成这一转换过程,设计人员必须处理以下任务: (1)针对分析模型中的用例,设计实现方案。实现方案用 UML交互图表示。 (2)设计技术支撑设施。在大型软件项目中,往往需要一些技术支撑设施来帮助业务需求层面的类或子系统完成其功能。这些设施本身并非业务需求的一部分,但却为多种业务需求的实现提供公共服务。例如,数据的持久存储服务、安全控制服务和远程访问服务等。在面向对象设计中,需要研究这些技术支撑设施的实现方式以及它们与业务需求层面的类及子系统之间的关系。 (3)设计用户界面。 (4)针对分析模型中的领域概念模型以及第(2)、(3)两个步骤引进的新类,完整、精确地确定每个类的属性和操作,并完整地标示类之间的关系。此外,为了实现软件重用和强内聚、松耦合等软件设计原则,还可以对前面形成的类图进行各种微调,最终形成足以构成面向对象程序

设计的基础和依据的详尽类图。 面向对象的软件设计过程如图8-1-1所示。 图 8-1-1 面向对象的软件设计过程 第一节设计用例实现方案 UML 的交互图(顺序图、协作图)适于用例实现方案的表示。因此,本节首先介绍交互图的语言机制,然后探讨用例实现方案的设计方法。该设计方法包含如下3个步骤: (1)提取边界类、实体类和控制类; (2)构造交互图; (3)根据交互图精华类图。 一、顺序图 顺序图用来描述对象之间动态的交互关系,着重表现对象间消息传递的时间顺序。在顺序图中,参与交互的对象位于顶端的水平轴上,垂直轴表示时间,时间推移的方向是自上而下的。顺序图中的对象一般以“对象

面向对象的三个基本特征讲解

面向对象的三个基本特征是:封装、继承、多态。 封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 继承 面向对象编程(OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 在某些OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。 继承概念的实现方式有三类:实现继承、接口继承和可视继承。 实现继承是指使用基类的属性和方法而无需额外编码的能力; 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力; 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。 在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类

都可以继承Person 类。但是Leg 类却不能继承Person 类,因为腿并不是一个人。 抽象类仅定义将由子类创建的一般属性和方法,创建抽象类时,请使用关键字Interface 而不是Class。 OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。 多态 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。 实现多态,有二种方式,覆盖,重载。 覆盖,是指子类重新定义父类的虚函数的做法。 重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。 其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚邦定,它就不是多态。” 那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。 概念讲解 泛化(Generalization)

面向对象分析设计小结

?1、面向对象方法的基本观点: ?Coad-Y ourdon认为:面向对象=对象+类+继承+通信。 ?2、面向对象方法的特点包括: ?(1)、符合人们对客观世界的认识规律; ?(2)、对需求变化具有很强的适应性; ?(3)、支持软件复用; ?(4)、可维护性好。 ?3、对象、类、封装、继承、消息、多态性的基本概念。 对象是客观世界中具有可区分性的、能够唯一标识的逻辑单元,是现实世界中的一个事物(站在计算机技术角度,即对事物的模拟)。 类是一组具有相同属性和相同操作的对象的集合。 封装是把对象的属性和操作结合在一起,组成一个独立的单元。 继承是指子类(派生类、特化类)自动拥有其父类(基类、泛化类、超类)的全部属性和操作,即一个类可以定义为另一个更一般的类的特殊情况。 消息是对象之间采用消息传递来发生相互作用—互相联系、互发消息、响应消息、协同工作,进而实现系统的各项服务功能。 多态性是一种方法,使在多个类中可以定义同一个操作或属性名,并在每一个类中有不同的实现。 ?4、面向对象系统开发过程。 ?5、运用名词词组法来定义类(对象): ?例:音像商店出租/出售业务信息系统中的类的确定。 ?总目标:?A.提供及时培训。?B.实施的系统必须友好,易学易用。?C.实施的系统必须考虑安全问题。

?具体目标: ?1.1.1 提供一个自动系统协助顾客出售/出租结帐。 ?2.1.1 提供和维护一个自动的会员数据库。?a. 按要求提供最新会员信息。? b. 有添加、改变、删除会员信息的能力。 2.1.2 提供会员信息报表(但不限于)?a. 最少光顾的会员。?b. 最经常光顾的会员。?c. 有问题会员(欠钱,出租过期)? 4.1.1 提供、维护出售和出租项的库存数据库。?a. 按要求提供最新库存信息?b. 有添加、改变、删除库存信息(出售和出租)的能力 4.1.2 提供库存信息报表(但不限于)?a. 最不受欢迎的出租项?b. 最受欢迎的出租项?c. 过期的出租项?d. 出售和出租项的“订购”产品(采购报表) 5.1.1 提供出售报表(但不限于)?a. 用产品码表示的一段时间(天、星期、月)内销售情况?b. 用产品码表示的一段时间(天、星期、月)内出租情况相应的侯选对象清单为:安全问题、自动系统、顾客出售/出租结帐、会员数据库、会员信息、会员信息报表、库存数据库、出售和出租项、库存信息、库存信息报表、采购报表、出售报表。 ?6、对多值属性的处理方法:用部分-整体方法。 例:发票/发票行 第2章统一建模语言UML 1、UML描述的软件基本模型:用例视图、逻辑视图、构件视图、进程视图、 部署视图 2、UML的基本符号。 3、RUP项目开发过程的特征:用例驱动的系统、以体系结构为中心、螺旋 上升式的开发过程、以质量控制和风险管理为保障措施。

《面向对象技术》课程教学大纲

《面向对象技术》课程教学大纲 课程编号:20411101 总学时数:48 总学分数:3 课程性质:必修课程 适用专业:计算机科学与技术 一、课程的任务和基本要求 该课程是计算机科学与技术专业的专业基础课程。本课程的基本要求是掌握面向对象程序设计的基本原理、概念和方法;掌握C++语言的基本知识,包括类的定义、继承,对象的创建、使用、销毁等;掌握基本的面向对象程序设计过程和技巧,具备一定的面向对象程序设计能力,为后继课程打下基础。 二、基本内容和要求 1、面向对象技术概要 教学内容:概括地面向对象技术,介绍C++语言和C语言的差异。 基本要求: (1)了解面向对象技术特点 (2)掌握C++ 语言的输入、输出 (3)掌握C++ 语言的空间申请和释放 (4)了解C++ 语言的对象引用的含义 2、类的定义 教学内容:介绍C++语言中最基本的类定义,数据成员和函数成员,三种权限区域。 基本要求: (1)理解类和对象的概念 (2)掌握类构造函数和析构函数的定义方法和作用 (3)掌握对象的定义及初始化方法 (4)掌握类成员函数和内联函数的定义方法 (5)掌握函数重载的方法 (6)熟悉运算符的重载方法 3、类的派生与继承 教学内容:介绍类与类之间的派生关系,派生类的成员继承和存取权限,函数多态基本要求: (1)了解派生类的定义方法 (2)掌握派生类中继承成员的存取关系 (3)掌握派生类构造函数的定义与执行顺序 (4)了解虚函数和抽象类的作用 (5)了解编译多态和运行多态 4、类的友元和聚合 教学内容:不同类间引用的权限,封装与效率的关系,静态数据成员 基本要求:

(1)熟悉类的友元及应用 (2)了解类的封装和聚合 (3)熟悉类静态数据成员的作用与应用 5、面向对象的程序设计 教学内容:面向对象设计的思想、对象的生存期、对象的永久化和对象的传输。 基本要求: (1)熟悉面向对象程序设计的思想 (2)了解对象的创建过程和销毁过程 (3)掌握对象的永久化的操作方法 (4)熟悉对象传输的含义和实现方式 6、模板 教学内容:介绍函数模板和模板函数,类模板和模板类,STL的使用 基本要求: (1)熟悉函数模板 (2)熟悉类模板 (3)了解利用模板的使用方法 (4)熟悉STL的应用 7、异常处理 教学内容:异常处理的内容。 基本要求: (1)了解异常处理的目的 (2)熟悉异常处理的的基本形式 (3)了解异常处理的几种应用方式 三、实践环节和要求 通过由浅入深、循序渐进地练习,使学生通过上机来验证课堂教学的理论,全面了解面向对象技术的基本方法和编程技巧,学会设计一些简单的应用程序。 实验环节类型:上机 实验环节学时:16 1、含有类的C++程序设计(2学时) 上机内容:类的定义与应用。 2、类的继承与派生(2学时) 上机内容:派生类的定义与应用。 3、抽象类与重载(2学时) 上机内容:抽象类与重载。 4、友元与静态数据的应用(2学时) 上机内容:友元与静态数据的应用。 5、面向对象程序设计(4学时) 上机内容:使用面向对象技术设计应用程序。 6、模板的应用(4学时) 上机内容:类模板和类函数的应用。 四、教学时数分配 理论: 32 实验:上机:16 其它:

三种面向对象方法

三个著名的面向对象开发方法

摘要 主要介绍了3种典型的面向对象开发方法,并对它们进行了比较。面向对象的方法是一种分析方法、设计方法和思维方法。面向对象方法学的出发点和所追求的基本目标是使人们分析、设计与实现一个系统的方法尽可能接近人们认识一个系统的方法。 关键字:面向对象;开发方法;OMT;BOOCH;JACOBSON; 1.引言 面向对象的方法是一种分析方法、设计方法和思维方法。面向对象方法学的出发点和所追求的基本目标是使人们分析、设计与实现一个系统的方法尽可能接近人们认识一个系统的方法。也就是使描述问题的问题空间和解决问题的方法空间在结构上尽可能一致。其基本思想是:对问题空间进行自然分割,以更接近人类思维的方式建立问题域模型,以便对客观实体进行结构模拟和行为模拟,从而使设计出的软件尽可能直接地描述现实世界,构造出模块化的、可重用的、维护性好的软件,同时限制软件的复杂性和降低开发维护费用。 面向对象程序设计方法起源于六十年代末期的simnia语言.Smalltalk语言的出现,进一步发展和完善了面向对象的程序设计语言,从此面向对象与开发方法开始结合,出现 了面向对象的开发方法.自80年代后期以来,相继出现了多种面向对象开发方法,现将其中几种典型的方法作一比较分析. 2.三种典型的面向对象开发方法 2.1 OMT/Rumbaugh OMT(Object Modeling Technique)方法提出于1987年,曾扩展应用于关系数据库设计.1991年Jim Rumbaugh正式把OMT应用于面向对象的分析和设计.这种方法是在 实体关系模型上扩展了类、继承和行为而得到的.OMT覆盖了分析、设计和实现3个阶段,包括一组相互关联的类(class )、对象(object)、一般化(generalization)、继承(inheritance)、链(link)、链属性(link attribute)、聚合(aggregation)、操作(operation)、事件(event)、场景(scene)、属性(attribute)、子系统(subsystem)、模块(module)等概念. OMT方法把分析时收集的信息构造在3种模型中,这些模型贯穿于每个步骤,在每个步骤中被不断地精化和扩充.对象模型用ER图描述问题域中的列象及其相互关系,用类和关系来刻画系统的静态结构,包括系统中的对象、对象之间的关系、类的属性和操作等特征.动态模型用事件和对象状态来刻画系统的动态特性,包括系统对象的事件序列、状态和操作.功能模型按照对象的操作来描述如何从输入给出输出的结果,描述动态模型的动作所定义对象操作的意义。 OMT方法包含分析、系统设计、对象设计和实现4个步骤,它定义了3种模型,这些模型贯穿于每个步骤,在每个步骤中被不断地精化和扩充。这3种模型是:对象模型,用类和关系来刻画系统的静态结构;动态膜型,用事件和对象状态来刻画系统的动态特性;功能模型,按照对象的操作来描述如何从输人给出输出结果。分析的目的是建立可理解的现实世界模型。系统设计确定高层次的开发策略。对象设计的目的是确定对象的细节,包括定义对象的界面、算法和操作。实现对象则在良好的面向对象编程风格的编码原则指导下进行。 开发的四个阶段如下: (1)分析。基于问题和用户需求的描述,建立现实世界的模型。分析阶段的产物有: ●问题描述 ●对象模型=对象图+数据词典 ●动态模型=状态图+全局事件流图 ●功能模型=数据流图+约束 (2)系统设计。结合问题域的知识和目标系统的系统结构(求解域),将目标系统

面向对象程序设计基本概念

面向对象程序设计基本概念 面向对象设计是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在“对象”概念基础上的方法学。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。 对象:对象是要研究的任何事物。从一本书到一家图书馆,单的整数到整数列庞大的数据库、极其复杂的自动化工厂、航天飞机都可看作对象,它不仅能表示有形的实体,也能表示无形的(抽象的)规则、计划或事件。对象由数据(描述事物的属性)和作用于数据的操作(体现事物的行为)构成一独立整体。从程序设计者来看,对象是一个程序模块,从用户来看,对象为他们提供所希望的行为。 类:类是对象的模板。即类是对一组有相同数据和相同操作的对象的定义,一个类所包含的方法和数据描述一组对象的共同属性和行为。类是在对象之上的抽象,对象则是类的具体化,是类的实例。类可有其子类,也可有其它类,形成类层次结构。 消息:消息是对象之间进行通信的一种规格说明。一般它由三部分组成:接收消息的对象、消息名及实际变元。 面向对象主要特征: 封装性:封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象。 继承性:继承性是子类自动共享父类之间数据和方法的机制。它由类的派生功能体现。一个类直接继承其它类的全部描述,同时可修改和扩充。继承具有传递性。继承分为单继承(一个子类只有一父类)和多重继承(一个类有多个父类)。类的对象是各自封闭的,如果没继承性机制,则类对象中数据、方法就会出现大量重复。继承不仅支持系统的可重用性,而且还促进系统的可扩充性。 多态性:对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接受消息的对象自行决定,如是,同一消息即可调用不同的方法。例如:Print消息被发送给一图或表时调用的打印方法与将同样的Print消息发送给一正文文件而调用的打印方法会完全不同。多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应。在OOPL中可通过在派生类中重定义基类函数(定义为重载函数或虚函数)来实现多态性。

52 面向对象程序设计的基本概念

一、教学目标 1、知识与技能 (1)认识面向对象程序设计中对象、类的概念及其特征。 (2)认识面向对象程序设计中类、对象和实例的关系。 2、过程与方法 (1)能够举例说明现实世界与程序世界的对象及其特征。 (2)能够举例说明现实世界与程序世界的类及其特征。。 (3)能够画图表示类、对象和实例三者的关系。 3、情感态度和价值观 (1)能关注面向对象程序设计的基本概念。 (2)能产生对对象、类等的认识的愿望。 (3)能认识到掌握对象、类的概念是学习面向对象程序设计的前提。 二、重点难点 教学重点: (1)对象及其特征。 (2)类及其特征。。 教学难点: (1)类及其特征。 (2)类的继承。 (3)类、对象和实例的关系。 三、教学环境 1、教材处理 教材选自广东教育出版社的信息技术(选修一)《算法与程序设计》第五章第二节,本节以理论为主。面向对象程序设计涉及到一些基本的概念,认识和理解类、对象的基本概念,以及类、对象和实例之间的关系是掌握面向对象程序设计的基础,是进一步学习面向对象功能实现的的前提。内容编排尽量贯彻原教材的意图展开。 教学方法采用讲解、学生自主学习和合作学习相结合的学习方法。 2、预备知识 学生已认识面向对象程序设计的基本思想,初步了解了类、对象等概念,通过比较得知两种程序设计方法的优劣所在。有了这些基础,学习者明显产生了想进一步学习面向对象设计知识的欲望。 3、硬件要求 本节内容是纯理论,可在普通教室上,也可选在多媒体电脑教室中完成,以供学生实践。 4、所需课时:1课时 四、教学过程 导入:1、简要介绍本节课的教学目标:紧密联系现实生活中的实例理解面向对象程序设计中的主要概念如对象、类及其关系,知道这些概念在面向对象思想中的重要性。 2、联系实际生活提问导入:现实生活中我们经常说到“类”这个概念,如人类、花类、鸟类等等。“人类”又可分为黑人、黄种人、白人等小类,这些小类可以具体到某个人如张三、李四、王五等。前面我们提到计算机软件的开发过程就是人们使用计算机语言将现实世界映射到计算机世界的过程。那么这些概念在面向对象程序设计中是采用怎样的机制来实现映射的呢?这节课我们来作充分的探讨。 (一)对象

图书管理系统面向对象设计方法

目录 1.图书管理系统开发背景 (2) 2. 图书管理系统设计 (2) 2.1任务目标 (2) 2.2 图书管理系统需求描述 (2) 2.2.1系统组成 (2) 2.2.2图书管理系统功能描述 (3) 2.2.3 系统参与者 (3) 2.3 图书管理系统功能模型 (3) 2.3.1 功能模型描述 (3) 2.3.2功能模型的用例图 (3) 2.3.2.1读者借书等的用例图 (3) 2.3.2.2图书馆管理员处理借书、还书等的用例图 (4) 2.3.2.3系统管理员进行系统维护的用例图 (5) 2.4 图书管理系统对象模型 (7) 2.4.1 对象模型描述 (7) 2.4.1.1读者Borrower类 (7) 2.4.1.2系统管理员Administrator类 (7) 2.4.1.3图书管理员Librarian类 (7) 2.4.1.4书目Title类 (7) 2.4.1.5其他类 (7) 2.4.2 类图 (6) 2.5 图书管理系统动态模型 (9) 2.5.1 图书管理系统动态模型 (9) 2.5.2图书管理系统系列图 (10) 2.5.2.1系统管理员添加书籍的时序图 (10) 2.5.2.2系统管理员添加借阅者帐户的时序图 (10) 2.5.2.3系统管理员删书目的时序图 (11) 2.5.2.4图书管理员处理书籍借阅的时序图 (11) 2.5.2.5 读者查询籍息的时序图 (12) 2.5.3图书管理系统活动图 (12) 2.5.3.1借阅者的活动图 (12) 2.5.3.2图书管理员的活动图 (14) 2.5.3.3系统管理员维护借阅者帐户的活动图 (15) 2.5.3.4系统管理员进行书目信息维护的活动图 (16) 2.5.3.5系统管理员维护书籍信息的活动图 (17)

面向对象设计七大原则-步骤资料

面向对象设计原则 A. 面向对象设计七大原则 a) 开闭原则 ? 软件实体对扩展开发,对修改关闭。 ? 当软件系统面对着新的需求的时候,系统的设计是稳定的。 ? 满足“开-闭”原则系统的优点: 1. 通过扩展已有的模块,提供新的行为,满足新需求,使得变化中的软件系统有一定的适应性和灵活性 2. 已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使得变化中的模块有一定的稳定性和延续性. ? 怎样才能做到开闭原则? 1. 抽象化,为系统定义一个不再更改的抽象设计,这个设计预见了所有可能的变化。满足了开闭原则的“闭” 2. 找到系统中变化的部分,把可变性封装起来。使用继承或者其他方式来封装变化,将变化封装在一个方法中或者一个类中。 b) “里氏转换”原则(LSP)

? 定义:如果一个软件实体使用一个基类的话,那么一定适合于它的子类。也就是基类出现的地方,子类一定可以出现,替换后软件行为不会发生变化,而且它根本不能识别出基类和子类对象的区别。? 里氏转换原则是对开-闭原则的补充。违反了里氏原则,有就违反了开闭原则;反之不成立。 ? 里氏转换原则是继承复用的基础.只有当衍生类可以替换掉基类,软件功能不会受到影响的时候,基类才能被真正复用,而衍生类才能在基类的基础上增加新的行为。 ? 理氏转换原则是代理模式成立的基础.代理模式和真实主题模式都是抽象主题角色的子类。客户端只知道抽象主题,而代理主题可以替代抽象主题出现在任何地方 c) “依赖倒转”原则 ? 抽象不应该依赖于细节,细节应该依赖于抽象. ? (高层模块不应该依赖于底层模块,两个都依赖于抽象) ? 通俗地说:面向接口编程,不要对实现编程. d) “接口隔离”原则 ? 使用专门的接口比使用一个总的接口好;一个类对另外一个类的依赖性应当建立在最小的接口上的.

面向对象方法与结构化方法的比较

课程名称: 系统分析与设计 结构化方法和面向对象方法的比较结构化方法是结构化分析,结构化设计和结构化编程的总称,是最早最传统的软件开发方法,也是迄今为止信息系统中应用最普遍、最成熟的一种,它引入了工程思想和结构化思想,使大型软件的开发和编程都得到了极大的改善。 面向对象方法它不仅仅是一些具体的软件开发技术与策略,而且是一整套关于如何看待软件系统与现实世界的关系,用什么观点来研究问题并进行问题求解,以及如何进行软件系统构造的软件方法学。人们普遍认为面向对象方法是一种运用对象、类、继承、封装、聚合、关联、消息和多态性等概念和原则来构造系统的软件开发方法。 结构化方法和面向对象方法二者的比较如下。 一、基本思想的比较 结构化方法的基本思想主要体现在三个方面。 一、"自顶向下,逐步求精: 把程序看成是一个逐步演化的过程。把一个系统与程序看成是一层的。例如: 户籍管理系统可以划分为: 户籍迁入迁出,人员迁入迁出,户籍注销,人员注销等几个子系统,而每个子系统又划分为接收用户信息,实施处理,提供返回信息等等部分。 二、"模块化: 即将几个系统分成几个模块,每个模块实现特定的功能,最终整个系统由这些模块组成。模块跟模块之间通过接口传递信息,模块最重要的特点就是独立性,模块之间还有上下层的关系,上层模块调用下层模块来实现一些功能。

三、"语句结构化: 顺序结构、分支结构、循环结构,都是常用的语句结构。 面向对象方法的基本思想主要有: 一、客观世界中的事物都是对象,对象之间存在一定的关系,并且复杂对象由简单对象构成。 二、"具有相同属性和操作的对象属于一个类,对象是类的一个实例。 三、"类之间可以有层次结构,即类可以有子类,其中,子类继承父类的全部属性和操作,而且子类有自己的属性和操作。 四、"类具有封装性,把类内部的属性和一些操作隐藏起来,只有公共的操作对外是可见的,对象只可通过消息来请求其他对象的操作或自己的操作。 五、"强调充分运用人在日常逻辑思维中经常采用的思想方法与原则。例如: 抽象,分类,继承,聚合,封装,关联等。 二、基本原则的比较 结构化方法遵循基本原则有: 一、抽象原则: 是一切系统科学方法都必须遵循的基本原则,它注重把握系统的本质内容,而忽略与系统当前目标无关的内容,它是一种基本的认知过程和思维方式。 二、"分解原则: 是结构化方法中最基本的原则,它是一种先总体后局部的思想原则,在构造信息系统模型时,它采用自顶向下、分层解决的方法。 三、"模块化原则:

面向对象的三个基本特征和概念

面向对象的三个基本特征(讲解) 面向对象的三个基本特征是:封装、继承、多态。 封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 继承 面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。 继承概念的实现方式有三类:实现继承、接口继承和可视继承。 ?实现继承是指使用基类的属性和方法而无需额外编码的能力; ?接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力; ?可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。 抽象类仅定义将由子类创建的一般属性和方法,创建抽象类时,请使用关键字 Interface 而不是 Class。 OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。 多态 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。 实现多态,有二种方式,覆盖,重载。 覆盖,是指子类重新定义父类的虚函数的做法。 重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。 其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、 str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚邦定,它就不是多态。” 那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

《面向对象技术与方法》实验:案例分

中山大学软件学院软件工程硕士研究生 《面向对象技术与方法》课程实践环节 实验题目:案例分析(开源项目JHotDraw) 基本要求:阅读和分析开源(Open Source)项目JHotDraw的文档和源程序,并撰写一份分析报告评价JHotDraw在设计与实现方面的特点,特别是其中设计模式的运用。

背景知识 开源项目为软件开发人员提供了丰富的学习素材。通过开源项目的案例分析,既可能学到一个优秀作品的设计思想与实现风格,也可能从中吸取一些有缺陷作品的经验与教训。 JHotDraw是采用Java语言书写的、运用面向对象设计模式的一个典型案例,最初由设计模式领军人物Erich Gamma等人设计开发(1996),后来陆续改进并发布了多个版本,并逐步演化为一个著名的二维图形编辑器的应用框架(Application Framework)。由于在JHotDraw的设计中有机地组合运用了许多经典的设计模式,该二维图形编辑器框架具有良好的可复用性和可扩展性。 面向对象技术(特别是面向对象设计)的初学者非常值得深入学习该案例,从中理解如何有效地运用设计模式去解决软件设计中一些实际问题。可从以下URL: https://www.360docs.net/doc/e77854250.html,/或 https://www.360docs.net/doc/e77854250.html,/projects/jhotdraw 下载各个版本的JHotDraw文档与源代码。本实验要求针对JHotDraw 5.2进行案例分析。 在深入学习JHotDraw项目的源代码之前,建议先仔细阅读JavaWorld上关于JHotDraw 5.2的入门短文Become a Programming Picasso with JHotDraw,参见以下URL:https://www.360docs.net/doc/e77854250.html,/javaworld/jw-02-2001/jw-0216-jhotdraw.html 该文扼要介绍了JHotDraw的基本概况、程序包组织、基于JHotDraw框架的应用开发、JHotDraw中设计模式运用等。

面向对象程序设计的基本概念

一、教案目标 1、知识与技能 (1)认识面向对象程序设计中对象、类的概念及其特征。 (2)认识面向对象程序设计中类、对象和实例的关系。 2、过程与方法 (1)能够举例说明现实世界与程序世界的对象及其特征。 (2)能够举例说明现实世界与程序世界的类及其特征。。 (3)能够画图表示类、对象和实例三者的关系。 3、情感态度和价值观 (1)能关注面向对象程序设计的基本概念。 (2)能产生对对象、类等的认识的愿望。 (3)能认识到掌握对象、类的概念是学习面向对象程序设计的前提。 二、重点难点 教案重点: (1)对象及其特征。 (2)类及其特征。。 教案难点: (1)类及其特征。 (2)类的继承。 (3)类、对象和实例的关系。 三、教案环境 1、教材处理 教材选自广东教育出版社的信息技术(选修一)《算法与程序设计》第五章第二节,本节以理论为主。面向对象程序设计涉及到一些基本的概念,认识和理解类、对象的基本概念,以及类、对象和实例之间的关系是掌握面向对象程序设计的基础,是进一步学习面向对象功能实现的的前提。内容编排尽量贯彻原教材的意图展开。 教案方法采用讲解、学生自主学习和合作学习相结合的学习方法。 2、预备知识 学生已认识面向对象程序设计的基本思想,初步了解了类、对象等概念,通过比较得知两种程序设计方法的优劣所在。有了这些基础,学习者明显产生了想进一步学习面向对象设计知识的欲望。 3、硬件要求 本节内容是纯理论,可在普通教室上,也可选在多媒体电脑教室中完成,以供学生实践。 4、所需课时:1课时 四、教案过程 导入:1、简要介绍本节课的教案目标:紧密联系现实生活中的实例理解面向对象程序设计中的主要概念如对象、类及其关系,知道这些概念在面向对象思想中的重要性。 2、联系实际生活提问导入:现实生活中我们经常说到“类”这个概念,如人类、花类、鸟类等等。“人类”又可分为黑人、黄种人、白人等小类,这些小类可以具体到某个人如张三、李四、王五等。前面我们提到计算机软件的开发过程就是人们使用计算机语言将现实世界映射到计算机世界的过程。那么这些概念在面向对象程序设计中是采用怎样的机制来实现映射的呢?这节课我们来作充分的探讨。

面向对象三个基本特征

封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 继承 面向对象编程(OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 在某些OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。 继承概念的实现方式有三类:实现继承、接口继承和可视继承。 ? 实现继承是指使用基类的属性和方法而无需额外编码的能力; ? 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

? 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。 在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承Person 类。但是Leg 类却不能继承Person 类,因为腿并不是一个人。 抽象类仅定义将由子类创建的一般属性和方法,创建抽象类时,请使用关键字Interface 而不是Class。 OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。 多态 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。 实现多态,有二种方式,覆盖,重载。 覆盖,是指子类重新定义父类的虚函数的做法。 重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。 其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚邦定,它就不是多态。” 那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

相关文档
最新文档