分类分类
关注+2004-11-07作者:蓝点
18.2.1 类和对象
类是对象的软件抽象,是创建对象的模板。例如,如果一个人被看作一个对象的话,则人这个物种就可以被看作一个类。类定义描述了包括数据和功能在内的结构,对象由其创建。一个类表示一组相似的对象。对象是类的实例。
为什么需要类,想象这样一个情况,假如我们要编写一个Flash游戏,里面要有一些能自主活动的小人,这些小人都有相同的体貌特征和活动能力,那么,若我们要为每个小人编写程序的话,则工作量毫无疑问是巨大和重复的。在这种情况下,我们就应该创建一个“小人”类,以后每当需要一个新的小人时就从“小人”类生成一个小人即可。
话说到这里,你一定想到了元件和实例的关系。没错,类和对象的关系与元件和实例的关系一样,因为元件实际上就是Flash的内建类。
18.2.2 属性和方法
属性是数据,而方法是函数。属性是类知道的事情,而方法是类完成的事情。属性和方法都是类的职责。面向对象的软件开发是基于这样的概念:系统应由对象来创建,对象拥有数据和功能。属性定义数据,而方法定义功能。
显然,在面向对象的开发中,最重要的工作就是定义类。而定义类时,就必须定义它的属性和方法。属性的定义应该是直接明了的,需要定义它的名称和数据类型。方法的定义就是创建一个函数的过程,根据需要,你可以创建出能够接受参数且能够返回值的方法。
18.2.3 抽象
世界非常复杂,为了处理它的复杂性,在软件设计中,当需要对事物建立数学模型时,我们有必要对事物进行泛化或抽象。还是以人作为对象,从招聘的角度看,我们需要知道这个人的姓名、性别、年龄、教育背景、工作经历,联系方式,以及性格特点;而从相亲的角度看,则需要知道这个人的年龄、身高、外貌、教育背景、家庭背景,甚至生辰八字。还是同一个人,只是对他(或她)进行了不同的抽象而已,对一个事物进行怎样的抽象将依据你要设计的程序而定。
抽象是个分析的过程,是在事物周围绘制出一个清晰的框架的过程。抽象应该包含应用程序感兴趣的功能、属性、方法,而将其他因素忽略。这就是为什么招聘的抽象包含教育背景和工作经历,但不会包含生辰八字的原因。抽象的过程,就是定义类知道和要完成的事情的过程。
18.2.4 封装
尽管抽象告诉我们,对于招聘,我们应该存储应聘者的教育背景和工作经历,但它没有告诉我们该怎样完成这些事情。封装解决了如何为系统功能建模的问题。在面向对象的世界中,我们要把系统建模成类,类也要建模为属性和方法。设计类将如何完成这些事情的过程就被称为封装。
封装描述了如何在系统中划分功能的问题。我们并不需要知道对象内部是怎样实现的。封装暗示着我们能够以任何方式构建系统,如果需要的话,还可以在日后再次修改其内部的结构,只要系统中不同功能组件之间的接口没有发生变化,那么对系统中一个功能部分的改变不会对系统的其他功能部分产生影响。
封装是把事物周围的那个框架涂黑的过程。你可以定义任何想要定义的东西,但你并不需要告知外界你的做法。例如,当你到银行存取现金的时候,你并不需要知道银行的数据中心是如何使用大型机、小型机和PC机来记录你的账户信息的,它们使用着怎样的数据库和操作系统,也根本无关紧要,因为它们已经把账户服务的功能封装起来了。你只需走到柜台前,把存折递给银行的工作人员既可。通过隐藏起实现账户功能的细节,银行能够在任何时候自由改变功能实现,而不用费事得更换每一个用户的存折。
为了让应用程序容易维护和增加安全性及健壮性,需要限制对类的属性和方法的访问。基本思想如下:如果一个类想获取另一个类的信息,必需先征得同意,而不是直接拿来就用。考虑一下,在现实世界中其实也是按照这种方法工作的。如果你想了解其他人的姓名,你该怎么做?是直接询问这个人他的姓名呢,还是偷走他的钱包看看他的身份证呢?
18.2.5 继承
不同的类之间经常会存在相似性。两个以上的类也会经常共享相同的属性和/或相同的方法。因为我们并不想重复编写代码,因此我们就要利用这种相似机制。继承就是这种机制,它使你可以很容易的重用现有的数据和代码。
例如,学生都有姓名、地址、手机,也都能快跑。同时,老师也都有这些东西。毫无疑问,我们可以开发有关学生和老师的类,让它们一起运行。实际上,仅需要先开发Student类,一旦它运行起来了,制作一份拷贝,就叫Teacher类,并对其进行一些适当的修改即可。这样做很容易,但并不完美。如果Student类中的源代码出现错误将会怎样?你将不得不在两个地方改正错误。这将是索然无趣的工作。如果仅有一份代码拷贝用于开发和维护,这样不是更好吗?
这就是继承的思想。使用继承,就可以定义一个类来封装学生和老师之间的相似性。新的类将有属性name、address、mobileTelephone,以及方法run。我们可以把这个类命名为Person。
一旦定义了Person类,就可以从它继承出Student和Teacher类。我们称Person是Student和Teacher类的超类,而Student和Teacher类则是Person类的子类。任何超类知道和完成的事情,子类也知道。因此,既然Person类遇到恶狗时能撒腿就跑,Student和Teacher类也能。
18.2.6 多态
让我们考虑一下这个例子。你很爱你的女友,你对她说“亲爱的,我爱你”,你的女友热情的拥抱你,你还得到了一个吻,你觉得这很不错。然后,你来到了大街上,看到一位很有气质的美女,你也用跟女友打招呼的方式对这位美女说“亲爱的,我爱你”,你将立刻得到有关你的神经和品德方面的一些建议。随后,你又来到医院,对一老中医说“亲爱的,我爱你”,老中医将毫不犹豫的拉过你的手腕,开始为你把脉。你心想,无论何时当我遭遇这些对象并说“亲爱的,我爱你”时,这种情况肯定就会发生—这就是多态。
多态使得对象可以在事先不知道其他对象的类型时就与其他对象协作。
从这次经历中你可以学到几个有意思的经验:
第一,多态阻碍了你与其他对象之间的交互。你并不区别其他对象的类型,你以同样的方式对待他们。你的想法是其他对象都是人。多态是允许这种情况发生的一个概念。
第二,不同的对象以他们自己的方式作出不同的响应。你的女友拥抱你并给你吻;陌生的美女给你有关神经和品德方面的建议;而老中医则给你把脉。同一消息到达不同的对象,每一个完成的事情都是不同的。实际上,从各个对象的角度看,他们做了应该做的事情。
第三,多态可以实现一致而恰当的方法名。尽管每种对象都以适当的方式响应了“亲爱的,我爱你”,但还是要实现方法的不同版本。
多态性主要包括两个方面:
运算符的重载:同一运算符可以作用在多种对象类型上。
函数名重载:相同的函数名可以作用在不同的对象类型上,并产生不同的效果。
18.2.7 事件
面向对象的软件的运行是随着一个个事件的发生来进行的,这被称为“事件驱动”。例如,当你欣赏Flash动画时,实际上是正在发生一个个“进入帧”事件,在这些事件中,Flash Player会呈递每帧中的内容,所以你就能看到画面。
同样的,当你点击按钮时,一个按钮事件就发生了,该按钮事件中的脚本就被执行,这些脚本的作用可能是把你带到特定的场景、特定的帧,或是链接到某个URL。
在面向对象的程序设计中,整个软件都是以事件驱动的,这意味着假如没有任何事件发生,你的程序将寸步难行,不过好在程序中总是有某些事情发生的,即使所有其他的事件都不发生,也会有时间流逝这一事件在时刻发生着。
在本书后面章中的实际开发中,你将看到上述所有这些面向对象的概念的实际运用。
相关文章
更多+相同厂商
热门推荐
点击查看更多
点击查看更多
点击查看更多
说两句网友评论