软件工程——面向对象概述

devtools/2024/11/26 10:54:56/

(1)对象

在应用领域中有意义的、与所要解决的问题有关系的任何事物都可以作为对象,它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界和意义的东西。例如,一名职工、一家公司、一个窗口、一座图书馆、一本图书、贷款和借款等,都可以作为一个对象。

总之,对象是对问题域中某个实体的抽象,设立某个对象就反映了软件系统保存有关它的信息,并具有与它进行交互的能力。

对象的定义

对象是封装了数据结构及可以施加在这些数据结构上的操作的封装体,这个封装体有可以唯一标识它的名字,而且向外界提供一组服务。

属性表示对象的性质,属性值规定了对象所有可能的状态。对象的操作是指该对象可以展现的外部服务。

例如,大型客机可视为对象,它具有位置、速度、颜色、容量等属性,对于该对象可施行起飞、降落、加速、维修等操作,这些操作将或多或少地改变飞机的属性值(状态)。

(2)类

是具有相同数据结构和相同操作的一组相似对象的抽象。即表示某些对象在属性和操作方面的共同特征。

例如:直升飞机、大型客机、轰炸机可归为飞行器类。

共同属性有:位置、速度和颜色等

共同操作有:起飞、降落、加速和维修等

类是在对象之上的抽象,有了类以后,对象则是类的具体化,是类的实例。

把一组对象的共同特性加以抽象并存贮在一个类中的能力,是面向对象技术最重要的一点!

(3)消息

对象之间进行通讯的一种构造叫做消息。

当一个消息发送给某个对象时,包含要求接收对象去执行某些活动的信息。接收到消息的对象经过解释,然后予以响应。这种通讯机制叫做消息传递。发送消息的对象不需要知道接收消息的对象如何对请求予以响应。

访问一个方法的过程称为向这个对象发送一个消息。例如:MyCircle.Show(Green),

MyCircle是接收消息的对象的名字,

Show是消息名,

Green是消息的变元。

消息的理解

A)如何要求对象完成一定的处理动作?对象间如何进行联系?所有这一切都只能通过消息传递来实现。

B)传递消息的对象称为发送者,接受消息的对象称为接受者。

C)消息中只包含传递者的要求,它告诉接受者需要哪些处理,但并不指示接受者应该怎样完成这些处理。

D)消息完全由接受者解释,接受者独立决定采用什么方式完成所需的处理,发送者对接受者不起任何控制作用。

(4)封装

封装帮助你管理复杂度的方法是不让你看到那些复杂度。

在面向对象的程序中,把数据和实现操作的代码集中起来放在对象内部。一个对象好像是一个不透明的黑盒子,表示对象状态的数据和实现操作的代码与局部数据都被封装在黑盒子里面,从外面是看不见的,更不能从外面直接访问和修改这些数据和代码。

使用对象的时候只需要知道他向外界提供的接口的形式,无须知道它的数据结构细节和实现操作的算法。

信息隐藏的一个例子:

假设你有一个程序,其中的每个对象都是通过一个名为id的成员变量来保存一种唯一的ID。这种设计方法是用一个整数来表示ID,同时用一个名为g_maxId的全局变量来保存目前已分配的ID的最大值。每当创建新的对象时,你只要在该对象的构造函数中简单地使用id=++ g_maxId,就肯定能获得一个唯一的ID值,这样设计有没有问题?

问题:

1、如果你想把某些范围的ID留做它用该怎么办?

2、如果你想使用非连续的ID来提高安全性?

3、如果你想重新使用已销毁对象的ID?

4、如果你的程序是多线程的,这种方法也不是线程安全的。

创建新ID的方法就是一种你应该隐藏起来的设计决策。如果你在程序中到处使用++ g_maxId,你就暴露了创建新ID的方法。相反,如果你在程序中都使用id=NewId(),那么就把创建新ID的方法隐藏起来了。

再假设你发现需要把ID的类型由整型改为字符串。此时你会想到应该隐藏ID的类型。在C++里面,你可以简单地使用typedef把ID定义为IdType,或者定义一个IdType的类。

(5)继承

广义地说,继承是指能够直接获得已有的性质和特征,而不必重复定义它们。在面向对象技术中,继承是子类自动地共享基类中定义的数据和方法的机制。

(6)多态

“Thisability to manipulate more than one type with a pointer or a reference to abase classis spoken of as polymorphism” (《C++ Primer》第838页)。即用基类的指针/引用来操作多种类(基类和其派生类)的对象的能力称之为多态。它是从语言实现的角度来考虑的。

“polymorphismprovides another dimension of separation of interface from implementation, todecouple what from how”(《Think in Java》3rd edtion),即多态提供了另外一种分离接口和实现的尺度,即把“做什么”与“怎么做”分开 。它是从设计的角度考虑的。

“Theability to use the same expression to denote different operations is refered toas Polymorphism”,(《Object-OrientedMethods Principles & Practice》3rd Edition,第16页)。简单的说,多态就是“相同的表达式,不同的操作”,也可以说成“相同的命令,不同的操作”。这是从面向对象的语义的角度来看的。

三种说法分别从不同的角度来阐述了多态的实质。其中第三种说法尤为确切:

相同的表达式—函数调用

不同的操作——根据不同的对象就有不同的操作

比如在公司中有各种职责不同的员工(程序员,业务员,文管等),他们“上班”时,做不同的事情(也可以看作是一种业务逻辑),我们把他们各自的工作都抽象为"上班",关系如下:


http://www.ppmy.cn/devtools/137100.html

相关文章

Python编程整理汇总(基础汇总版)

1. 基础语法 1.1 变量与数据类型 整数:a 10 浮点数:b 3.14 字符串:c "Hello, World!" 布尔值:d True 列表:e [1, 2, 3, 4, 5] 元组:f (1, 2, 3) 字典:g {"name&qu…

如何通过 Java 实现 HTTPS 匿名 POST 提交

在开发过程中,我们经常会遇到需要通过 HTTPS 协议向服务器发送 POST 请求的情况。特别是在处理自签名证书或测试环境中,我们可能需要忽略 SSL 证书验证。本文将详细介绍如何使用 Java 实现这一功能,并提供优化后的代码示例。 背景 在实际开发中,我们可能会遇到以下几种情…

【Linux】常用系统工作命令

常用系统工作命令 1.echo2.date3.timedatectl4.wget5.ps6.pstree7.top8.nice9.pidof10.kill11.killall 1.echo echo 命令的作用是向用户显示一行文本。它可以用于各种情况,比如在脚本中输出提示信息、打印变量值、生成日志文件等等。 输出字符串。 echo "He…

rpm方式安装postgres数据库及普通用户管理数据库

一、安装postgres 数据库 下载rpm安装包 wget https://ftp.postgresql.org/pub/repos/yum/15/redhat/rhel-7.9-x86_64/postgresql15-libs-15.5-1PGDG.rhel7.x86_64.rpm wget https://ftp.postgresql.org/pub/repos/yum/15/redhat/rhel-7.9-x86_64/postgresql15-15.5-1PGDG.rh…

【漏洞复现】代付微信小程序系统 read.php 任意文件读取漏洞

免责声明: 本文旨在提供有关特定漏洞的信息,以帮助用户了解潜在风险。发布此信息旨在促进网络安全意识和技术进步,并非出于恶意。读者应理解,利用本文提到的漏洞或进行相关测试可能违反法律或服务协议。未经授权访问系统、网络或应用程序可能导致法律责任或严重后果…

QT QPushButton控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

前端知识点---稀疏数组(javascript)

文章目录 稀疏数组(javascript)稀疏数组的特点:如何创建稀疏数组:稀疏数组的行为:稀疏数组的实际应用:注意事项: 稀疏数组(javascript) 在 JavaScript 中,稀疏数组(sparse array) 是…

C#+数据库 实现动态权限设置

将权限信息存储在数据库中,支持动态调整。根据用户所属的角色、特定的功能模块,动态加载权限” 1. 数据库设计 根据这种需求,可以通过以下表设计: 用户表 (Users):存储用户信息。角色表 (Roles):存储角色…