ComputerSchoolofWuhanUniversity软件工程SoftwareEngineering计算机学院软件工程课程组SoftwareEngineering第6章什么是面向对象什么是面向对象?对象有哪些特点?什么是面向对象方法学?面向对象方法学与传统软件工程方法有哪些区别?什么是对象模型技术?建立哪些模型?SoftwareEngineering传统软件工程方法与面向对象方法Conventionalmethods部分缓解了软件危机适用于相对稳定的项目开发Object-orientedMethodology20世纪80年代提出90年代广泛应用二十一世纪成为首选的开发方法SoftwareEngineering什么是面向对象1、用计算求解现实问题的过程现实世界问题问题空间计算机求解空间解空间限定抽象计算机求解SoftwareEngineeringOOM的特点尽可能模拟人类习惯的思维方式问题域与求解域在结构上尽可能一致以数据或信息为主线,把数据和处理结合构成统一体——对象软件系统:一系列离散的集合程序一系列工作在数据上的函数集合CM相互协作又彼此独立的对象的集合解空间对象SoftwareEngineeringOOM的几个概念⑴对象对象有广泛含义信息处理对象:对象是一个具有局部属性(数据)和一个操作集所组成的实体,操作集规定了对其数据可施加的操作规则集。属性+操作Object::=〈Oid,Ds,Os,Mi〉Object::=〈id,Rm,Ds,Cs,ds,B〉NameSexAge…WalkJumpdanceLiliSoftwareEngineering②类与实例类(class):对具有相同属性和行为的一个或多个对象的描述,类是一种抽象定义,一个模板或一个模型,可用其生成具体的对象。即类是具有公共属性的多个对象的一种描述,由类生成的对象称为该类的实例。人中国人SoftwareEngineering类与实例示意图AttributesAgeFriend…MyleftlegMyrightlegMyheadMybodMyleftarmmyrightarmBehaviorStoreageAge?Jump…Dance…CreateaninstanceCreatemyleftlegCreaterightlegCreateheadCreatebodyZhangdaZhangxiaoLiliSoftwareEngineering③继承性继承性继承性关系是一种类间关系,将多类中的公共特性(行为和属性)定义为一个抽象类,由相关类共享。SoftwareEngineering④方法和消息方法和消息类通过方法说明它所能执行的操作来确定实例(对象)的行为。而一个对象调用所属类的方法称发消息。一般调用类的一个操作应说明:目标对象(多型对象除外)、方法名、变元表。SoftwareEngineeringOOM的四要素①对象(object)②类(class):data+methods③继承(inheritance)④方法与消息Coad&YourdonOOM=①+②+③+④SoftwareEngineering相关方法基于对象的方法①+④=Object-based基于类的方法①+④+②=Class-based面向对象方法①+④+②+③=Object-orientedSoftwareEngineering二、面向对象的概念对象(Object)类(Class)实例(Instance)消息(Message)方法(Method)属性(Attributes)封装(Encapsulation)继承(Inheritance)多态性(Polymorphism)重载(Overloading)SoftwareEngineeringf1f2f3……fi……fnfi(X)Sgi(X,S)S'输出输出1.对象(Object)fi(X,S)SoftwareEngineering(1)对象的定义对象是对属性值和操作的封装对象是一台自动机输入fi,x输出fi(x,S)状态S操作:f1,f2,…,fn状态转换函数:g1,g2,…,gn转换:新状态S'=gi(x,S)SoftwareEngineering定义1Object::=(Oid,DS,OS,MI)Oid对象名称(标识)DS={d1,d2,…,dn}数据结构集OS={o1,o2,…,om}操作集MI={m1,m2,…,mk}消息名称集SoftwareEngineering定义2Ojbect::=(id,RM,DS,CS,ds,B)id通讯地址RM消息集ReqM+FinMDS数据结构集CS通信状态集ds数据DS初始值B对象行为B∈(DS×CS×E→DS×CS×E×2°)SoftwareEngineering(2)对象的特点数据为中心主动的数据封装并行性模块独立性好SoftwareEngineering2.类(Class)属性颜色圆心半径方法(服务、操作)显示放大/缩小移动具有相同数据和相同操作的一组对象Class::=〈Cid,inh,Cdd,Cop,itf〉SoftwareEngineering3.实例(instance)姓名性别籍贯专业出生年月住址看书实验上课运动服务属性学生李杰男广东软件1980.49#楼129室看书实验上课运动王辉男湖南计算机控制1979.19#楼320室杨芳女北京系统结构1979.125#楼418室属性属性属性看书实验上课运动服务看书实验上课运动服务李杰杨芳王辉服务由某个特定的类所描述的一个具体的对象SoftwareEngineering4.消息(Message)要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明Message::=object_ID.method_ID(parameter(S))SoftwareEngineering5.方法(Method)对象所能执行的操作类中所定义的服务(Operations,methods,services,responsibilities)Show(intcolor)...SoftwareEngineering6.属性(Attributes)类中所定义的数据对客观世界实体所具有的性质的抽象属性颜色圆心半径SoftwareEngineering类和对象attributes:MethodsAclassisageneralizeddescriptionofacollectionofsimilarobjects.SoftwareEngineering7.封装(Encapsulation)把数据和实现操作的代码集中起来放在对象内部封装性的条件有一个清晰的边界有确定的接口(即协议)受保护的内部实现classnameattributes:operations:SoftwareEngineering8.继承(Inheritance)子类自动地共享基类中定义的数据和方法的机制类等级chairtabledeskchableinstancesofchairfurniture(superclass)subclassesSoftwareEngineering类的继承机制类AA的操作A的变量A的实例a1类AA的实例变量类B:A的子类B的操作B的变量从A继承的特性B的实例b1继承来的A的实例变量继承来的B的实例变量类BSoftwareEngineering【例】类的继承机制Class中国人中国人methods中国人attributesinstance张三Class中国人张三attributesClass武汉人(子类)武汉人methods武汉人attributesClass中国人instance李四中国人李四的attributes武汉人李四的attributesClass武汉人低层性质override高层性质SoftwareEngineering继承的传递性(transitivity)CB,BACA一个class继承了上层全部classes的一切性质ABCSoftwareEngineering单继承和多重继承单继承(singleinheritance)一个类只允许有一个父类类等级为树形结构多重继承(multipleinheritance)一个子类可有多个父类功能更强,使用更方便注意避免二义性汽车运货车救火车小轿车起重车退休者教师退休教师SoftwareEngineering多重继承的二义性(ambiguity)多个父类中定义重名,但各具不同性质的方法CardDeckGraphicalObjectMethod:Draw:=takeacardfromadeckMethod:Draw:=displayagraphicalobjectMethod:Draw:=?SoftwareEngineering继承的优点共享程序代码和数据结构减少了冗余信息修改方便扩充:调用基类方法并增加代码改变:改写同名方法新增:定义新方法软件重用SoftwareEngineering9.多态性(Polymorphism)发送消息的对象不需要知道接受对象的类,接收方决定消息的解释不同层次的classes可共享一个method名,而按各自的方式来实现该method虚函数(virtualfunction):一个method有多个版本,运行时才决定执行哪一个SoftwareEngineering动态联编(dynamicbinding)/滞后联编(latebinding)虚函数(virtualfunction):一个method有多个版本,运行时才决定执行哪一个把函数调用与目标代码块的连接延迟到运行时进行使系统更灵活,易于扩充多边形四边形矩形三角形drawSoftwareEngineering10.重载(Overloading)函数重载(function/parameteroverloading)参数特征不同算法不同运算符重载(operatoroverloading)操作数(operand)类型不同运算符语义不同SoftwareEngineeringdoubleavg(constdoublea[],intsize);doubleavg(constinta[],intsize);doubleavg(constdoublea[],intsize);{doublesum=0.0;for(inti=0;isize;++i)sum+=a[i];return(sum/size);}doubleavg(constinta[],intsize);{intsum=0;for(inti=0;isize;++i)sum+=a[i];return((double)sum/size);}main(){intk[3]={1,2,3};doublex[3]={1.1,2.2,3.3};coutavg(k,3)“intaverage\n”;coutavg(x,3)“doubleaverage\n”;}重载静态联编(staticbinding)先前联编(earlybinding)编译阶段就决定了使用类型及执行代码不同函数共用一个名字,而调用参数的特征不同SoftwareEngineering三、OOM的主要优点与人类习惯的思维方法一致稳定性好可重用性好可维护性好较易开发大型软件产品SoftwareEngineering1.与人类习惯的思维方法一致CM面向过程设计,以算法为核心,送数据到函数数据与操作分离,不易理解数据程序代码处理Data…Codes…一致!问题空间解空间语义断层不一致SoftwareEngineeringObject1.与人类习惯的思维方法一致OOM以object为核心,强调对现实概念的模拟而不强调算法“面向对象方法学的基本原则,是按照人们习惯的思维方式建立问题域的模型,开发出