您的位置:首页 > 其它

第一章 面向对象基础

2007-02-03 00:40 330 查看
一、面向对象的基本特性

        以下五个基本特性详尽的表现了一种纯粹的面向对象的程序设计方式:

        1. 万物皆为对象

        将现实世界里的任何事物(当然是和你程序设计相关的)表示为对象,它可以用来存储数据,如顾客,汽车等,也可以提供给客户端程序员(即调用者)的构件,用来提供对象自身的操作,如一组相关的服务等。那么你现在就可以创建一个对象,比如你家的狗,我们可以存储这个对象的一些数据,比如说它的名字:旺财,也可以对它执行一些操作,比如说让它看家。只要和你的程序设计相关,我们基本上可以把世间万物都看作是对象,如同前面提到的例子。

        2. 程序是对象的集合,它们通过发送消息来告知彼此所要做的

        一个一个的对象组成了我们所写的程序,那么它们之间怎么交互呢?一堆没有任何关联的对象对于我们来说没有任何意义。在这里,我们首先要理解的是“消息”指的是什么。一般认为消息就是对象提供的方法,但是消息是个动态的概念,消息的产生必然有消息的请求者和消息的接受者,当对象A向对象B发送一条消息时,对象A是请求者,对象B是接受者(或者理解为提供服务者),此时我们可以把消息想象为对象A对对象B的某个特定方法(或者服务)的调用请求。这样对象和对象之间才能彼此合作来完成程序所需要的功能。

        3. 每个对象都拥有自己的由其他对象所构成的存储

        这句话理解起来有点抽象,简而言之就是可以通过现有对象创建出新的对象,那么在存储新的对象的同时,它也保存了构件它的其他对象。比如现有对象为机箱,显示器,输入/输出设备等,我们创建一个电脑对象,它是由现有的这些对象构成的,那么在存储电脑这个对象的时候也就存储了机箱,显示器,输入/输出设备等对象。

        4. 每个对象都拥有其类型

        现在就要引入“类”这个概念了。首先看一个例子,联想电脑是一个对象,戴尔电脑也是一个对象,他们都具有名称,长,宽,高等等相同的特性以及开机,关机等等相同的方法,按照正常的思维,我们必然会把他们归属为一类——电脑。此时,不管是“联想电脑”还是“戴尔电脑”,它们都有一个类型——电脑。我们现在可以称“电脑”为一种类型(即类),而“联想电脑”或者“戴尔电脑”是这个类的具体的实例(即对象)。类与类之间最重要的区别在于可以发送怎样的请求给它。

        5. 某一特定类型的所有对象都可以接受同样的消息

        这里提到的“可替代性”是面向对象设计中最强有力的概念之一。正如前面所看到的例子,开机这个消息(即类的方法)并不是和某个具体的对象(如联想电脑)相关联,只要是“电脑”这个特定类型的对象,都可以接受这个消息。

        更加简洁的描述可以用这个等式来表述:对象 = 属性 + 行为 + 标识(即地址)。

二、类与对象的关系

        1. “类”与“原始类型”

        我们所熟悉的原始类型如int类型,它从本质上讲也是一个类,它描述了所有int型数字具有的相同的特性和操作。它们之间的区别在于,int类型是用来表示机器中的存储单元的数据类型,并不能象“类”一样随意添加新的数据类型进行扩展,创建满足需要的类型。编译器完全接受这种自己创建的类,并且象对待原始类型一样地照管他们和进行类型检查。

        2. “类”与“对象”

        每个对象都是某个类的一个实例;每个类都是某一组对象的抽象。可以理解为类是抽象的,对象是具体的。比如说现实生活中并没有电脑这个实体,只有某某牌的电脑,此时电脑这个类就是一种抽象,而某某牌的电脑才是一个具体的实体(即对象)。值得注意的是,每个对象都属于定义了特性和行为的某个特定的类。

三、类

        1. 类的隐藏

        一般将程序开发人员分为类创建者(创建数据类型)和类调用者(使用数据类型),那么类创建者如何隐藏类中不提供给类调用者的部分呢?在回答这个问题之前我们先来看看为什么要隐藏。第一个原因是让类调用者无法触及他们不应该触及的部分,比如说内部实现必须的操作,它们并不是提供给类调用者的服务,我们不应该暴露它们。第二个原因是允许类创建者可以改变类内部的工作方式而不用担心会影响到类调用者。访问控制可以很好的为我们解决这些问题。通过声明一个私有的方法来隐藏这个方法,使得它仅仅能够为本类提供服务。

        2. 类的复用

        组合(has - a):只要能够实现想要的功能,我们可以使用任意数量、任意类型的其他对象以任意的方式组成新的 类。如汽车拥有轮胎、引擎等等。

        继承(is - a 或者 is - like - a):当两个类具有相同或相似的特性和行为时,我们可以抽象出它们所共享的特性和行为,产生一个它们共同的父类(或基类),然后让这两个类来继承这个共同的父类,我们称之为子类(或派生类),那么子类便拥有了父类所有的特性和行为,如同儿子继承了父亲的所有遗产一样。那么什么是is-a,什么又是is-like-a呢?如果子类继承父类时没有添加新的属性或方法或者只是覆盖了父类的方法,这也就意味着子类和父类具有完全相同的属性和行为,简言之就是具有相同的类型,那么我们称这种继承是is-a关系,即子类是一个父类;如果子类继承父类时添加了新的属性或方法,这也就意味着子类扩展了父类并创建了新的类型,具有新的不同于父类的属性和行为,简言之就是具有相似的类型,那么我们称这种继承是is-like-a关系,即子类像一个父类。通过这两种方式都可以实现了类的继承,只要仔细审视,它们的应用场合应该是相当明显的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息