第2章 拜访对象村
有人告诉我那里遍地都是对象。在第1章中,我们把所有的程序代码放在main()里面。事实上,那根本就不是面向对象的做法。我们是调用到一些对象,比如String等,但是没有开发出自己设计的对象类型。所以我们要离开过程化的世界,开始建立自己的对象。我们会看到为何 Java 中的面向对象开发是如此的有趣。我们也会看到类与对象的不同,以及对象是如何让你的生活更美好(至少程序设计工作的部分会更好,但对于是否能够受到异性的青睐就不一定了)。注意:一旦进入对象村,你就不想再回头。
椅子大战
从前,有一间软件小铺,里面有两个程序员被指派去设计一个程序。坏心的老板娘兼项目经理要求两个人比赛,赢的人可以坐上象征身分地位的Aeron.宝椅。程序开发高手阿珠跟面向对象信徒阿花两个人都认为自己赢的可能性很大。
阿珠坐在自己的座位上想着:“这个程序要执行什么动作?我会需要什么样的程序?有了,我需要rotate与playSound!”,然后她就开始进行设计的工作。
同时, 阿花去倒了一杯咖啡回来, 心想着:“这个程序有什么样的事物?有什么关键角色?”。她首先想到形状体(shape)。当然啦,她还会想到用户、声响等对象与点击等事件。然而这些对象早就已经建立好了,所以她只需要专注于创建形状体就行了。
接下来就是她们如何设计程序的故事以及你最想知道的答案:“谁赢了 Aeron. 宝椅?”。
阿珠
如同以往,她准备好要开始设计重要的程序。没几下她就写出了rotate与playSound两个方法。
rotate(shapeNum) { |
阿花
阿花分别为3个形状各写出一个类。
|
正当阿珠心想说赢定了,开始幻想坐在宝椅上接受大家投以羡慕的眼光……
等一下!老板娘说规格改了。
“OK,技术上来说阿珠赢了……大毛!你给我过来!”老板娘一边追打小孩一边说:“但是我作了一点小小的改变,对你们这种高手来说一定很简单的”。
“说呀,还要改什么?”阿珠与阿花不约而同地盯着角落的折凳看,四只手好像随时准备抄起凳子开始干活,不过想到已经忍了这么久,也不差这一次。
|
阿珠
原来的rotate程序还可以用;该程序使用一个对应表来找寻特定编号的图形。但是playSound就得要修改。还有.hif文件是什么鬼东西?
playSound(shapeNum) { |
虽然修改幅度不大,但是她实在不想去碰已经测试过的程序代码。她应该很清楚,不管项目经理怎么保证,规格就是会不停地改。
阿花
她苦笑一下,耸一耸肩,坐下来写出一个新的类。面向对象让她最喜欢的其中一点就是有时不需动到已经测试好的程序就可以达成新目标。面向对象的适应性与可扩展性让她面对修改时不会觉得太过于痛苦。
|
但是听到坏心老板娘用失望的口吻说出“唉呀,不对呀,阿米巴原虫不是这样旋转的……”时,阿珠的脸色都变了。
原来,两个人都把旋转的部分写成这样:
(1)找出指定形状的外接四边形。
(2)计算出四边形的中心点,以此点为轴作旋转。
但是老板娘认为阿米巴原虫应该是要绕着一端旋转,类似秒针那样。
“坏了”,阿珠心里这么想着,眼前浮现出早上烤焦的两片土司。“但我还是可以加上额外的if/else到rotate程序中硬改给阿米巴原虫,这样应该还好吧”。然而脑海中不断有个声音在提醒她:“太天真了,你以为规格不会再改吗?”。
|
阿珠
她想到最好还是帮rotate程序加上轴心点的参数。这样就有一堆程序要改。本来已经测试好的东西全部又得重来一遍。
rotate(shapeNum, xPt, yPt) { |
阿花
她修改了rotate这个方法, 但不是每个都要改,只修改Amoeba这个类而已。其他已经测试、编译过的部分完全没有必要改。该类要作的修改就是加上旋转轴心点的属性(attribute)。
|
所以阿花赢了,对吧?
还早,阿珠发现阿花的方法有缺陷。并且她认为假如能够赢得胜利,老板娘的地位早晚也会被她取代,因此她得要扭转形势。
阿珠:“你有重复的程序代码!在4个Shape物体中都有rotate过程”。
阿花:“那不叫过程,那是方法好吗?还有,物体的正式名称叫做类”。
阿珠:“无所谓。你的设计有问题。这样一来你必须同时维护4个不同的rotate方法。这一点效率都没有”。阿花:“我猜你一定没看到最终的设计。阿珠,让我告诉你什么叫做面向对象的继承(inheritance)”。
|
那阿米巴的rotate()要怎么办?
阿珠:“问题不就出在这里吗?阿米巴形状会需要完全不同的rotate与playSound程序?”
阿花:“那叫方法。”
阿珠:“如果阿米巴也是继承自Shape,那旋转的功能不就统统一样吗?”
阿花:“问得好。Amoeba这个类可以覆盖(override)Shape的方法。Java虚拟机会知道在遇到Amoeba时使用不同的rotate()。
|
剧情真是太紧张了。到底是谁赢了?
最后是阿娇获胜。(其实有3个参赛者。附带说明:阿娇是老板娘的侄女。)
当你在设计类时,要记得对象是靠类的模型塑造出来的。你可以这样看:
对象是已知的事物
对象会执行的动作
|
所以你也可以把对象当作为实例。
对象可以执行的动作称为方法。在设计类时,你也会设计出操作对象数据的方法。对象带有读取或操作实例变量的方法是很常见的情形。举例来说,闹钟对象会有个变量来保存响铃时间,且会有getTime()与setTime()这两个方法来存取该时间。
因此说对象带有实例变量和方法,但它们都是类设计中的一部分。
| 回书目 上一节 下一节 |
|
||||
| · CCNA认证考试Pass必备 · 无线网络环境 · 无线路由器故障处理 · 解析35岁技术人的价值.. · 无线重中之重:安全问题 · 无线局域网基本知识 · 家庭无线局域网 · 华为七千人主动辞职规.. |
· 微软出价446亿美元收购.. · 虚拟化的“赤壁之战” · Windows Server 2008专.. · 802.11n:下一代的无线.. · 脉冲无线电uwb专题 · AIX操作系统管理应用 · 云计算时代来临 · 求职必杀技 决战面试官 |
|||
|
||||
| · SOA 面向服务架构 · SQL Server 2008/2005.. · Apache技术专题 · 三层交换技术专题 · SQL Server入门到精通 · 无线网状网(MESH) · Windows远程桌面应用 · C#技术开发指南 |
· Apache技术专题 · Windows集群服务应用 · C#技术开发指南 · 文档格式标准开战 OOXM.. · 路由器设置与口令恢复 · Linux 集群技术专题 · PHP开发应用手册 · SOA 面向服务架构 |
|||
|
||||
| · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · Apache技术专题 · C#技术开发指南 · 三层交换技术专题 · Apache技术专题 · C#技术开发指南 |
· Windows远程桌面应用 · 企业数据恢复指南 · Windows集群服务应用 · 路由器设置与口令恢复 · Linux 集群技术专题 · SOA 面向服务架构 · 了解统一威胁管理(UTM).. · 解析35岁技术人的价值.. |
|||