首页 理论教育 面向对象的基础概念在软件工程中

面向对象的基础概念在软件工程中

时间:2023-11-06 理论教育 版权反馈
【摘要】:下面将简单介绍一下面向对象中几个基本的也是非常重要的概念。在面向对象的技术中,把具有相同属性和相同操作的一组相似对象也归为一“类”。类是在对象之上的抽象,对象则是类的具体化,是类的实例。

面向对象的基础概念在软件工程中

面向对象的软件工程将以面向对象视角,采用面向对象的分析设计方法来解决搭建软件系统的问题,因此对于面向对象概念的理解和把握将直接影响面向对象系统的构成质量。下面将简单介绍一下面向对象中几个基本的也是非常重要的概念。

1.对象(Object)

对象是在应用领域中有意义的、与所要解决的问题有关系的任何事物。它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界和意义的东西。从一支笔到一家商店,从简单的整数到整数列,极其复杂的自动化工厂、航天飞机都可看作对象。它不仅能表示有形的实体,也能表示无形的(抽象的)规则、计划或事件。面向对象方法学中的对象是由描述该对象属性的数据(数据结构)以及可以对这些数据施加的所有操作封装在一起构成的统一体。这个封装体有可以唯一地标识它的名字,而且向外界提供一组服务。从程序设计者来看,对象是一个程序模块;从用户来看,对象为他们提供所希望的行为或服务;从对象自身来看,这种服务或行为通常称为方法。

要想深刻理解对象的特点,就必须明确对象的下述特点。

(1)以数据为中心

所有施加在对象上的操作都基于对象的属性,这样保证了对象内部的数据只能通过对象的私有方法来访问或处理,也保证了对这些数据的访问或处理,在任何时候都是使用统一的方法进行的。

(2)对象是主动的

对象向外提供的方法是自身向外提供的服务。对于数据的提供不是被动的,而是根据自身的特点及接收发来的消息进行处理后向外反馈信息。

(3)实现了数据封装

使用对象时只需知道它向外界提供的接口形式而无须知道它的内部实现算法。不仅使得对象的使用变得非常简单、方便,而且具有很高的安全性和可靠性,实现了信息隐藏。

(4)对象对自己负责

对象可以通过父类得知自己的类型,对象中的数据能够告诉自己它的状态如何,而对象中的代码能够使它正确工作。

(5)模块独立性好

对象中的方法都是为同一职责服务的,模块的内聚程度高。

2.类(Class)

我们一般习惯于把有相似特征的事物归为一类。在面向对象的技术中,把具有相同属性和相同操作的一组相似对象也归为一“类”。类是对象的模板,即类是对一组有相同属性和相同操作的对象的定义,一个类所包含的方法和属性描述一组对象的共同属性和行为。类是在对象之上的抽象,对象则是类的具体化,是类的实例。类可有其子类,也可有其他类,从而形成类的层次结构。

例如,三个圆心位置、半径大小和颜色均不相同的圆,是三个不同的对象,但是,它们都有相同的属性(圆心坐标、半径、颜色)和相同的操作(计算面积、绘制图形等),因此,它们是同一类事物,可以用“Circle:类”来定义。

类与类之间存在三种相互关系:

(1)泛化关系(Generalization)

B类继承了A类,就是继承了A类的属性和方法,A类称之为父类,B类称之为子类。子类在获得父类功能的同时,还可以扩展自己的功能。

(2)依赖关系(Dependency)

对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。在代码实现中,主要体现在某个类对象存在于另一个类的某个方法调用的参数中,或某个方法的局部变量中,或调用被调用类的静态方法中。

(3)关联关系(Association)

对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的结构关系时,这两个对象之间为关联关系。例如,班级是由学生组成的,这是客观存在的规则,是不能够随意改变的固定结构关系。关联有两种特殊的形式,聚合(Aggregation)和组合(Composition)。

聚合指的是整体与部分的关系,当整体不存在了,部分仍可以独立存在,例如计算机和组成计算机的配件;组合表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期,即整体对象不存在,部分对象也将不存在,例如鸟和翅膀之间的关系,当鸟不存在了,鸟的翅膀也就没有存在的意义了。

从代码层面上讲,关联、聚合和组合没有什么区别,主要是从语义环境中加以区分,当这种结构关系比较强的时候,就可以考虑使用聚合或组合关系了。

3.实例(Instance)

实例是由某个特定的类所描述的一个具体的对象。类是对具有相同属性和行为的一组相似的对象的抽象,类在现实世界中并不能真正存在。(www.xing528.com)

在地球上并没有抽象的“中国人”,只有一个个具体的中国人,例如,张三、李四、王五……实际上类就是建立对象时使用的“模板”,按照这个模板所建立的一个个具体的对象,才是类的实际表现,称为实例。可以说对象就是实例。在程序设计中将特定的类称为实例,在业务环境中(或分析过程中)将特定的类称为对象。

4.消息(Message)

消息是对象之间进行通信的一种规格说明,一般由三部分组成:接收消息的对象、消息名及实际变元。例如,MyCircle是一个半径为4cm、圆心位于(100,200)的Circle类的对象,也就是Circle类的一个实例。当要求它在屏幕上绘制出自己时,在JAVA语言中应该向它发下列消息:

MyCircle.draw():

消息的发送相当于A向B发送请求doSomething(),则B必须具有doSomething的这项服务,也就是B对外提供公共方法,A了解B的行为后,请求B为其提供服务,帮助A解决B管辖范围内的事务。消息就是A向B发起的请求。

5.方法(Method)

方法是指对象所能执行的操作,也就是类中所定义的服务。方法描述了对象执行操作的算法或者响应消息的方法。例如,为了Circle类的对象能够响应让它在屏幕上绘制出自己的消息,在Circle类中必须给出成员函数draw()的定义,也就是要给出这个成员函数的实现代码。

6.属性(Attribute)

属性指类中所定义的数据,它是对客观世界实体所具有的性质的抽象。类的每个实例都有自己特有的属性值。例如,Circle类中定义的代表圆心坐标、半径、颜色等的数据成员,就是圆的属性。

7.封装(Encapsulation)

封装是面向对象的主要特征之一,它是一种信息隐蔽技术,它体现于类的说明。封装使数据和加工该数据的方法(函数)封装为一个整体,使得用户只能见到对象的外部特性(对象能接收哪些消息,具有哪些处理能力),而对象的内部特性(保存内部状态、私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象的使用者分开,使用者不必知晓行为实现的细节,只需用设计者提供的接口来访问该对象。

对象具有封装性的条件如下:

(1)有一个清晰的边界。所有私有数据和实现操作的代码都被封装在这个边界内,从外面看不见,更不能直接访问。

(2)有确定的接口(即协议)。这些接口就是对象可以接收的消息,只能通过向对象发送消息来使用它。

(3)受保护的内部实现。实现对象功能的细节(私有数据和代码)不能在定义该对象的类的范围外访问。

8.继承(Inheritance)

继承是子类自动共享父类之间数据和方法的机制,它由类的派生功能体现。一个类直接继承其他类的全部描述,同时可修改和扩充。继承能够直接获得已有的性质和特征,而不必重复定义它们。

继承具有传递性。继承分为单继承(一个子类只有一个父类,使得类等级成为树形结构)和多重继承(一个类有多个父类,多重继承的类可以组合多个父类的性质构成所需要的性质)。类的对象是各自封闭的,如果没有继承机制,则类对象中数据、方法就会出现大量重复。继承不仅支持系统的可重用性,而且还促进系统的可扩充性。

一个类实际上继承了它所在的类等级中在它上层的全部基类的所有描述,也就是说,属于某类的对象除了具有该类所描述的性质外,还具有类等级中该类上层全部基类描述的一切性质。

9.多态性(Polymorphism)

多态性指对象根据所接收的消息而做出动作。同一消息为不同的对象接收时可产生完全不同的行动,这种现象称为多态性。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接收消息的对象自行决定,这样,同一消息即可调用不同的方法。例如,Print消息被发送给一个图或表时调用的打印方法与将同样的Print消息发送给一个正文文件而调用的打印方法会完全不同。多态性的实现受到继承的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应。在面向对象编程中可通过在派生类中重定义基类函数来实现多态性。

10.重载(Overloading)

重载是在同一类层次中,使用同一方法名,通过传递不同类型的参数来确定具体的方法的一种机制。

重载在面向对象中有两种:

(1)函数重载。是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字。

(2)运算符重载。是指同一个运算符可以施加于不同类型的操作数上面。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈