- 1、本文档共44页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
03–2–面向对象程序设计高级
第3章 面向对象程序设计高级 郭建宏 椅子大戰 從前,有一間軟件小鋪,裡面有兩個程序員被指派去設計一個程序。 壞心的老闆娘兼項目經理要求兩個人比賽,贏的人可以坐上象徵身份地位的AeronTM寶椅。 程序開發高手阿珠和面向對象的信徒阿花兩個人都相信自己贏的可能性很大。 需求 在图形接口中画出四方形(squre),圆形(circle)和三角形(triangle),图形需要顺时针绕中心旋转,同时输出AIF音效文件。 阿珠是怎樣做的? 和以往一样,阿珠准备好开始设计重要的程序。没几下就写出了rotate和playSound方法。 rotate() { // 绕中心旋转360度。 } playSound() { // 播放aif文件。 } 阿花是怎樣做的? 阿花分别为三个形状各写出一个类。 新的需求(一) 前面的形状需要加上阿米巴原虫(Amoeba)形状。 用户点选时也是旋转并播放.hif的声音文件。 阿珠该怎样做? 原来的rotate程序还可以用。 但是playSound就得要修改。 虽然修改的幅度不大,但是阿珠实在不想去碰已经测试过的程序代码。他应该很清楚,不管项目经理怎么保证,需求就是会不停的改。 playSound(shapeNum) { // 参数用来标识传入的是否是amoeba图形 // 如果不是阿米巴形状,则播放.aif文件。 // 如果是则播放.hif文件 } 阿花該怎樣做? 阿花则写出一个新的类。 面向对象让他最喜欢的其中一点就是有时不需改动已经测试好的程序就可以达成新的目标。 面向对象的适应性和可扩展性让他面对修改时不会觉得太痛苦。 新的需求(二) 阿米巴虫在旋转的时候需要以给定的作为原点旋转。 阿珠該怎樣做? 阿珠最好还是帮rotate程序加上轴心点的参数。这样就有一堆程序要改。 本来已经测试好的东西全部又得重来一遍。 rotate(shapeNum, xPt, yPt){ // 如果不是阿米巴,则绕中心旋转。 // 否则以xPt和yPt作为旋转中心旋转。 } 阿花该怎样做 阿花修改rotate这个方法,但不是每个都要修改,只修改Amoeba这个类而已。 其他已经测试、编译过的部分完全没有必要修改。 该类需要的修改就是加上旋转轴心点的属性。 问题的解决 从上面的分析可以看出,阿花的设计是非常好的。 但是还有一个问题,在每个类中rotate和playSound有很多都是重复的。这样做太没有效率了。该怎样解决这样的问题呢? 答案就是应用“继承”来解决。 怎樣繼承 继承概述 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承单独的那个类即可。 多个类可以称为子类,单独这个类称为父类或者超类。 通过extends关键字让类与类之间产生继承关系。 class SubDemo extends Demo{} 子类继承父类后,都继承了父类的那些哪些成员呢? 子类继承了父类的属性,包括私有属性。 子类继承了除构造方法外的其他所有方法。 问题: 为什么子類對象在實例化之前必須首先調用父類中的構造方法之後再調用子類自己的構造方法? 继承的特点 Java只支持单继承,不支持多继承。 一个类只能有一个父类,不可以有多个父类。 class SubDemo extends Demo{} //ok class SubDemo extends Demo1,Demo2...//error Java支持多层继承(继承体系) class A{} class B extends A{} class C extends B{} 子类对象实例化 子類對象在實例化之前必須首先調用父類中的構造方法之後再調用子類自己的構造方法。 定义继承需要注意 不要仅为了获取其他类中的某个功能而去继承。 类与类之间要有所属(“is a”)的关系,xx1是xx2的一种。 阿米巴的rotate该怎么办? 阿米巴形状会需要完全不同的rotate和playSound程序,如果都继承Shape,那旋转的功能就都一样了。 解决方法:Amoeba这个类可以覆盖(override)Shape的方法。(多态) 阿米巴的rotate该怎么办? 方法覆写(Override) 子类中出现与父类一模一样的方法时,会出现覆盖操作,也称为重写或者复写。 父类中的私有方法不可以被覆盖。 在子类覆盖方法中,继续使用被覆盖的方法可以通过“super.函数名”获取(super关键字部分介绍)。 覆盖注意事项 覆盖时,子类方法权限一定要大于父类方法权限。 privateprotecteddefaultpublic 静态只能覆盖静态。 覆盖的应用 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这样,即沿袭了父类的
文档评论(0)