计算机科学与工程学院软件工程(SoftwareEngineer)第九章面向对象技术面向对象方法的形成最初是从面向对象程序设计语言开始的,随之才逐渐形成面向对象分析和设计方法。面向对象方法的出现以20世纪60年代末挪威奥斯陆大学和挪威计算中心共同研制的SIMULA语言为标志,面向对象方法的基本要点首次在SIMULA语言中得到了表达和实现。90年代以后,OOA(Object-OrientedAnalysis)/OOD(Object-OrientedDesign)方法逐渐走向实用。一些专家按照面向对象的思想,对系统分析和系统设计工作的步骤、方法、图形工具等进行了研究,提出了许多不同的实施方案。其中影响较大的有P.Coad和E.Yourdon的方法、G.Booch的方法和J.Rambough的OMT方法等,在实践中使用较多。计算机科学与工程学院软件工程(SoftwareEngineer)9.1面向对象的概念1.对象对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务构成。属性和服务,是构成对象的两个主要因素,其定义是:属性是用来描述对象静态特征的一个数据项。服务是用来描述对象动态特征(行为)的一个操作序列。计算机科学与工程学院软件工程(SoftwareEngineer)9.1面向对象的概念2.类类是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。类与对象的关系如同一个模具与用这个模具铸造出来的铸件之间的关系。类给出了属于该类的全部对象的抽象定义,而对象则是符合这种定义的一个实体。计算机科学与工程学院软件工程(SoftwareEngineer)9.1面向对象的概念3.封装第一个涵义是,把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象);第二个涵义也称作“信息隐蔽”,即尽可能隐蔽对象的内部细节,对外形成一个边界(或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系。计算机科学与工程学院软件工程(SoftwareEngineer)9.1面向对象的概念4.继承特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。继承意味着“自动地拥有”,或曰“隐含地复制”。就是说,特殊类中不必重新定义已在它的一般类中定义过的属性或服务,而它却自动地、隐含地拥有其一般类的所有属性与服务。计算机科学与工程学院软件工程(SoftwareEngineer)9.1面向对象的概念5.接口接口可以看作是一个特殊的类形式,除了不能被实例化为一个对象外,它可以实现类能够完成的任何任务,如声明对象为某种接口类型,接口作为方法型参。接口可以被继承,也可以继承别的接口,接口继承机制是非常有用的,如一个子类对象可以看作一个父类对象,接口也具备这样的特性,在很多时候程序员可以将一个子接口类型的对象定义为父接口类型的对象,从而实现一般化的操作。计算机科学与工程学院软件工程(SoftwareEngineer)9.1面向对象的概念6.消息消息就是向对象发出的服务请求,它应该含有下述信息:提供服务的对象标识、服务标识、输入信息和回答信息。计算机科学与工程学院软件工程(SoftwareEngineer)9.1面向对象的概念7.结构与连接一般—特殊结构整体—部分结构实例连接消息连接计算机科学与工程学院软件工程(SoftwareEngineer)9.1面向对象的概念8.多态性对象的多态性是指在一般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现不同的行为。这使得同一个属性或服务名在一般类及其各个特殊类中具有不同的语义。计算机科学与工程学院软件工程(SoftwareEngineer)9.2面向对象概念举例1.静态字段和方法常量是其值在使用过程中不会发生变化的字段。在声明和初始化常量时,在字段的前面加上关键字const来标示。静态字段与常量不同,静态字段在无法随类一起实例化,但值可以修改。C#语言中静态字段和静态方法用关键字“static”来标示,与静态成员相对的是实例成员,实例成员需要通过实例来访问,而静态成员属于类来本身,通过类名来访问。计算机科学与工程学院软件工程(SoftwareEngineer)9.2面向对象概念举例2.属性属性是一种用于访问对象或类的特性的成员。属性可以包括字符串的长度、字体的大小、窗体的标题和客户的名称等。属性是字段的自然扩展,二者都是关联类型的命名成员。访问字段和属性的语法是相同的。与字段不同的是,属性不表示存储位置。属性有访问器,这些访问器指定在它们的值被读取或写入时需要执行的语句。因此属性提供了一种机制,它把读取和写入对象的某些特性与一些操作关联起来。它们提供灵活的机制来读取编写或计算私有成员的值。可以像使用公共数据成员一样使用属性,但实际上它们是称为“访问器”的特殊方法。这使得数据在可被轻松访问的同时,仍能提供方法的安全性和灵活性。计算机科学与工程学院软件工程(SoftwareEngineer)9.2面向对象概念举例3.类中的继承和重载派生类很少一成不变地去继承基类中的所有成员。一般情况是:派生类中的方法成员可以隐藏基类中同名的方法成员,这时通过关键字new对成员加以修饰;另一种普遍和灵活的情况是:将基类的方法成员定义为虚拟(virtual)方法,而在派生类中对虚拟方法进行重载。后者的优势在于它可以实现运行时的多态性,即程序可以在运行过程中确定调用哪个类的方法成员。计算机科学与工程学院软件工程(SoftwareEngineer)9.2面向对象概念举例4.接口类是对一组具有相同性质的对象的抽象,而接口是对一组能够提供相同服务的类的抽象。类对程序的各个对象进行分组,而接口程序则对程序中的各个类进行分组。接口通过关键字interface来定义,其所能提供的服务用方法来描述。接口是一种抽象的数据类型,它不能像类那样被实例化。接口定义了服务,但并不提供服务的实现方式。如果某个类继承了接口,他就需要实现该接口所定义的服务。类对接口的继承语法与类之间继承的语法相同。一个类只能继承一个基类,但同时可以继承多个接口,如果一个类同时继承了接口和其他的类,定义时需要将基类写在前面,接口写在后面。计算机科学与工程学院软件工程(SoftwareEngineer)9.2面向对象概念举例5.委托我们习惯于把数据作为参数传递给方法,所以,给方法传送另一个方法听起来有点奇怪。而有时某个方法执行的操作并不是针对数据进行的,而是要对另一个方法进行操作,这就比较复杂了。在编译时我们不知道第二个方法是什么,这个信息只能在运行时得到,所以需要把第二个方法作为参数传递给第一个方法,而这就是委托。委托类似于C++等语言中的函数指针,用于封装某个方法的调用过程。委托是完全面向对象的,它所封装的方法必须与某个类或对象的方法相关联。委托的使用分为3步:定义、实例化和调用。计算机科学与工程学院软件工程(SoftwareEngineer)9.2面向对象概念举例6.泛型泛型多用于集合的操作,在不确定数据类型的情况下,定义一个链表泛型List,可以将int、string、Datetime、自定义的类Student、接口ICalculate等都加载在List中,从而达到用一个链表结构,实现各种数据类型(包括未知数据类型)的链表操作。泛型可以有灵活的应用比如泛型方法、泛型接口、泛型类、泛型委托,当然很多都比较复杂,如果要掌握这些知识,需要先熟练掌握泛型类。泛型的关键字是,在定义时比较常见的是T,比如这段代码表示泛型Assemble:publicclassAssembleT,T叫做类型参数,T可以是泛型允许的各种类型。泛型在没有确定T的时候叫开放类型;确定了T以后叫封闭类型,比如:AssembleintassembleInts;这里的Assembleint就是一个封闭类型,封闭类型就如同普通的类一样,不再具有类型可变化性。计算机科学与工程学院软件工程(SoftwareEngineer)9.2面向对象概念举例7.事件事件是类在发生其关注的事情时用来提供通知的一种方式,例如,封装用户界面控件的类可以定义一个在用户单击该控件时发生的事件。控件类不关心单击按钮时发生了什么,但它需要告知派生类单击事件已发生,然后,派生类可选择如何响应。事件处理代码用委托来指定,通过事件处理代码,对象可以对已发生的情况做出特定的反应。某个事件发生后,对象通过该事件的委托调用适当的事件处理代码,此时委托充当了产生事件的对象与响应事件的方法之间的“中间人”。计算机科学与工程学院软件工程(SoftwareEngineer)习题九类和对象的表示方法是什么?并通过实例进行说明。什么是设计模式,设计模式的基本组成元素是什么?交通工具分为空中、陆上、水上交通工具,空中交通工具分为客机、货机、专用轻型机;陆上交通工具分为火车、汽车,火车和汽车又分客车、货车,水上交通工具有轮船,轮船分为客轮、货轮、客货混合轮。建立交通工具的对象模型。