您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 面向对象分析与设计第四章(类型系统多态)
面向对象分析与设计易国洪2第四章类型系统学习目的:理解类型系统的含义理解多态性理解隐式和显示类型转换了解Java模板提供的一般特性34.1引言类型系统是一个简单的概念:它是一组禁止误用值(原型和对象)的规则。类型系统的一个简单例子是声名变量总是包含特定类型的值:–inti;–Employeefred误用值的原因:不理解值得用法拼错了值得名称类型系统优点:确保提供代码的某些说明,提高运行时系统的性能44.2动态和静态类型系统类型系统可以是静态的,也可以是动态的。类型系统的这两个变体可以确保程序员不会误用值:静态类型系统禁止编译期间的误用,动态类型系统检查是否出现误用,并禁止它。54.3多态性多态性(Polymorphism)多态(Polymorphic)在纯面向对象的语言中,所有的非原型变量都是多态的,所有的消息都是多态的。PolymorphicvariablePolymorphicmessage6多态变量Java声名表示,t总是指向Truck类型的对象:Truckt;因此可以这样赋值t=newTruck();一般这样做:Truckt=newTruck();7多态变量考虑下图的类层次结构,它说明,Truck是一种陆上交通工具(Landvehicle),根据这个层次结构,就可以把Truck当作Landvehicle来对待。所以:Landvehiclelv=newTruck();也是有效的8多态变量这有点令人困惑,但考虑一下:刚才告诉编译器,把lv用作LandVehicle,就能给它发送LandVehicle消息,而所有的LandVehicle消息都发给Truck,所以一切正常。既然lv可以指向Truck那么lv同样可以指向Train9多态变量前面lv指向Truck,后面又指向Train,所以lv必须使一个多态变量。这是很直观的lv是LandVehicle,所以指向LandVehicle的任意类型。变量的多态性是由继承控制的。lv=newOrange();多态允许把变量关联到子类对象上,但不能反向lv=newVehicle();10多态消息在纯面向对象的语言中,任何消息都可以关联多个方法。这是因为方法在多个类中是独立的,或者方法由子类重新定义。重新定义的方法一般有类似的算法,但独立定义的方法通常有完全不同的算法。11多态消息12多态消息13多态消息多态消息与继承相关,其关联方式与多态变量相同。例如:下面的代码段中,运行时系统会在Finch上执行flyto方法,而不在Bird上执行(原因是什么?)Birdb;b=newFinch();b.flyto(someLocation);b=newEagle();b.flyto(someLocation);14多态消息多态变量只是一个占位符,在这个占位符中要填充变量指向的对象。下面代码中有一个Cat,但有两个指向它的引用Cattiddles,tom;tiddles=newCat(“tiger”);tom=tiddles;154.4动态绑定动态绑定表示,在运行期间把消息关联到方法上。这是面向对象语言处理多态变量和重定义的方式。164.4动态绑定174.4动态绑定在下面的代码段中,运行时系统如何获知在发送getPerimeter()消息时,执行三个方法中的纳一个呢?ShapeaSquare=newSquare();inti=aSquare.getPerimeter();从概念上看,接收消息的对象aSquare知道它自己的类,所以就到类中查找方法;而类Square定义了getPerimeter()方法,于是执行这个方法。184.4动态绑定上图还显示了一个getNumberOfCorners()消息,该消息在Shape上是抽象的,在Quadrilateral上是具体的。在下面的代码段中,Square再次到它的类中查找getNumberOfCorners()方法:ShapeaSquare=newSquare();intj=aSquare.getNumberOfCorners();这次没有匹配的方法,所以继续在Quadrilateral超类中搜索。在Quadrilateral中有一个匹配的方法,因此就执行这个方法。这个动态绑定的算法看起来有点慢。194.4动态绑定有了静态类型,就可以确保动态绑定会在超类链中找到具体方法(因为每个变量的类型都必须声明,而且不能创建抽象对象)有了动态类型系统,就可能遇到抽象方法,或者到达类层次结构的最顶层,此时会出现运行时错误信息。对于多重继承,动态绑定较复杂,但仍是可行的。204.5多态性规则设计规则:总是使用尽可能高的抽象级别来编程也就是说,总是把字段、本地变量、方法、参数的类型声明放在继承层次结构最高的类中,在让多态性完成其它工作。制定这个规则的原因是,所使用的抽象级别越高,代码的可重用性就越大。类层次结构的设计人员还有一个责任:他们应确保,只要可能,每个类的类型就隐藏在应用于所有相关类的一般消息中。例如在屏幕上绘制Square与Triangle完全不同,我们不应把这些区别展示给客户程序员,而应设计一个或一组放在Shape上的消息。214.6类型转换在静态类型的语言中,当从一个上下文给另一个上下文传送值是,需要确保二者兼容,甚至在确保新上下文与旧上下文兼容时,仍需要把二者的值的类型转换为同一类型。224.7显示类型转换作业,请同学们上网和其它方式找到Java或C#或c++的类型转换大全。234.8使用模板进行泛化较难,感兴趣的同学可以看看,不作要求
本文标题:面向对象分析与设计第四章(类型系统多态)
链接地址:https://www.777doc.com/doc-3968275 .html