一、面向对象的基本概念
面向对象是一种软件开发方法和编程范式,其基本概念包括对象、类、封装、继承、多态等。
1.对象
- 定义:是面向对象系统运行时的基本实体 ,将属性(数据)和行为(作用于数据的操作)封装为整体 。一般由对象名、属性和方法组成。程序设计者视其为程序模块,用户关注其提供的行为。
- 特性:每个对象都有唯一的标识,不同对象之间通过发送消息来进行交互,从而实现各种功能。
- 封装:是信息隐蔽技术,分离使用者和生产者,分开定义与实现。
2.类
- 定义:类定义了一组相似对象,其方法和数据描述对象的共同行为与属性 ,是对象的抽象,对象是类的实例。
- 分类:
- 实体类:对象代表现实实体,如人、物。
- 接口类(边界类):为用户与系统交互提供方式 ,分人、系统接口,人接口有显示屏等,系统接口涉及数据收发。
- 控制类:对象控制活动流,起协调作用。
- 类间关系:存在一般和特殊关系(is - a 关系 ),特殊类是一般类的子类,一般类是特殊类父类,如 “汽车”“轮船”“飞机” 类是 “交通工具” 类子类,“汽车” 类下还有 “轿车”“货车” 等更特殊类,形成层次关联。
3.消息
- 概念:对象间通信的构造 ,发送消息含要求接收对象执行活动的信息 ,接收对象解释后响应,此为消息传递 ,发送方无需知接收方响应方式。
- 类与消息关系:类定义方法界面,规定实例的消息传递协议和合法范围 ,为实例提供可预知的交互方式 ,并以
m1.ChangeLevel(2);为例说明向对象发送消息的方式。
4.方法重载
- 定义:在一个类中可以定义多个同名的方法,但是每个方法的参数类型、参数个数或参数顺序必须不同 。通过这种方式,调用方法时,编译器或解释器能依据传递参数的差异来确定具体调用的方法。
5.继承
- 定义:继承是父类和子类间共享数据和方法的机制 。子类可在已存在类(父类 )基础上定义,将父类内容作为自身内容,并添加新内容。

- 继承关系中的访问权限:涉及父类成员(属性、方法)在子类中的访问控制 。例如,Java 中
private修饰的父类成员子类无法直接访问;protected修饰的成员可在子类中访问。 - 构造函数与继承:子类构造函数可能需调用父类构造函数初始化从父类继承的属性 。如在 C++ 中,子类构造函数可通过初始化列表调用父类构造函数。常考构造函数的调用顺序(先父类后子类 )及原因。
- 方法重写(覆盖):子类重新实现父类的方法 。重写要求方法名、参数列表、返回值类型(部分语言有特殊规则,如协变返回类型 )与父类一致,且访问修饰符权限不能比父类更严格 。
- 抽象类与接口:抽象类包含抽象方法(只有声明无实现 ),不能实例化,子类继承抽象类需实现抽象方法;接口是特殊抽象类型,成员默认
public,类实现接口需实现接口中所有方法 。 - 继承类型:
- 单重继承:像图中 B 只从一个父类 A 继承,称为单重继承 。
- 多重继承:若子类有两个或更多父类,则为多重继承 。
- 父类与子类特点:一个父类可有多个子类,子类是父类特例,父类描述子类公共属性和方法 。子类可继承父类(或祖先类 )属性和方法,也能定义自己的属性和方法。
6.多态
- 定义:不同对象收到同一消息产生完全不同结果的现象称为多态。用户发送通用消息,接收对象自行决定实现细节,使同一消息可调用不同方法。
- 多态与继承的关系:多态的实现受继承支持。利用类的继承层次关系,将具有通用功能的消息置于高层次,不同的功能实现行为放在较低层次,低层次生成的对象能对通用消息作出不同响应。
- 多态形式
- 参数多态:应用较为广泛,被称为最纯的多态。
- 包含多态:在许多语言中都存在,常见例子是子类型化(一个类型是另一个类型的子类型)。
- 过载多态:同一个名字在不同的上下文中所代表的含义不同。

7.静态、动态绑定
绑定是一个把过程调用和响应调用所需要执行的代码加以结合的过程。在一般的程序设计语言中,绑定是在编译时进行的,叫作静态绑定。动态绑定则是在运行时进行的,因此,,一个给定的过程调用和代码的结合直到调用发生时才进行。动态绑定是和类的继承以及多态相联系的。在继承关系中,子类是父类的一个特例,所以父类对象可以出现的地方,子类对象也可以出现。
二、面向对象设计的原则
- 单一责任原则(SRP):一个类只有一个引起变化的原因,专注一种类型责任。
- 开放 - 封闭原则(OCP):软件实体可扩展(开放),但不可修改(封闭)。
- 里氏替换原则(LSP):子类型能替换基类型,父类出现处可用子类实例赋值,具 is - a 关系。
- 依赖倒置原则(DIP):抽象不依赖细节,细节依赖抽象;高层与低层模块都依赖抽象。
- 接口分离原则(ISP):不强迫客户依赖无用方法,依赖抽象而非具体,抽象级别无细节依赖,以应对变化。
- 重用发布等价原则(REP):重用的粒度即发布的粒度。
- 共同封闭原则(CCP):包中类对同一类性质变化共同封闭,一个变化若影响包,则影响包内所有类。
-
面向接口编程原则:不将变量声明为具体类,而声明为接口。客户程序只需知道接口,无需了解具体实现,减少依赖,实现 “高内聚、低耦合”。
-
组合 / 聚合复用原则(Composite/Aggregate Reuse Principle, CARP):优先使用组合或聚合实现代码复用,而非继承。组合 / 聚合保持类间松耦合,且不破坏封装性;继承则可能导致父类细节暴露(白箱复用),耦合度高。
-
共同重用原则(Common Reuse Principle,CRP):一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。
-
无环依赖原则(Acyclic Dependencies Principle,ADP):在包的依赖关系图中不允许存在环,即包之间的结构必须是一个直接的五环图形。
-
稳定依赖原则(Stable Dependencies Principle,SDP):朝着稳定的方向进行依赖。
-
稳定抽象原则(Stable Abstractions Principle,SAP):包的抽象程度应该和其稳定程度一致。
三、面向对象分析(OOA)
面向对象分析包含5个活动:认定对象、组织对象、描述对象间的相互作用、确定对象的操作、定义对象的内部信息。
- 认定对象:在应用领域中,依据自然存在的实体来确立对象。通常先将自然存在的 “名词” 作为对象,这是研究问题和定义实体的起点。重点在于寻找对系统有关键影响的实质性对象,这类对象是系统稳定性的基础。
- 组织对象:分析对象之间的关系,将相关对象抽象成类,利用类的继承性构建具有层次结构的类体系,以简化关联对象。抽象类时,可从对象间的操作或 “部分 - 整体” 关系(如 “房子由门和窗构成”)入手。
- 描述对象间的相互作用:明确对象之间如何通信与协作,以实现系统功能。
- 确定对象的操作:定义对象能够执行的动作或行为。
- 定义对象的内部信息:确定对象的属性、数据结构及内部状态等信息。
四、面向对象设计
面向对象设计(Obiect-Oriented Desigm,OOD)是将 OOA 所创建的分析模型转化为设计模型,其目标是定义系统构造蓝图。OOA与OOD之间不存在鸿沟,采用一致的概念和一致的表示法,OOD同样应遵循抽象、信息隐蔽、功能独立、模块化等设计准则。
OOD 在复用 OOA 模型的基础上,包含与 OOA 对应如下五个活动。
- 识别类及对象。
- 定义属性。
- 定义服务。
- 识别关系。
- 识别包。
五、面向对象程序设计
- 程序设计范型决定思维与工具,面向对象程序设计(OOP)选用面向对象语言(OOPL),借助对象、类等概念设计,关键在于引入类和继承,提升抽象程度。
- OOP 扩展至系统分析与设计,形成面向对象分析(OOA)和面向对象设计(OOD)。
- 设计与实现面向对象程序时,先接触类及类层次结构。
六、面向对象测试
-
测试层次
- 算法层:测试类中每个方法,类似传统单元测试,关注方法逻辑正确性。
- 类层:测试类内方法与属性的相互作用,是面向对象特有的模块测试(如类中方法对属性的操作是否符合预期)。
- 模板层:测试协同工作的类间交互,类似集成测试,但强调对象间消息传递(如订单类与库存类的交互)。
- 系统层:将子系统组装为完整系统进行测试,验证是否满足需求(如电商系统整体功能、性能测试)。
-
测试方法
- 黑盒测试(等价类划分、边界值分析)用于验证功能正确性,白盒测试(语句覆盖、判定覆盖)用于检查代码逻辑覆盖。
- 传统测试技术(如逻辑覆盖、等价类划分)仍适用,但封装、继承、多态增加测试复杂度(如多态导致动态绑定,需测试不同子类实例的行为)。
-
特性带来的测试难点
- 封装:内部细节隐藏,需通过接口设计测试用例,确保接口功能正确且无漏洞。
- 继承:子类继承父类,需测试子类对父类功能的继承与扩展是否正确,重写方法是否破坏原有逻辑。
- 多态:同一消息不同对象响应不同,需测试不同子类对象在多态场景下的行为是否符合预期。
183

被折叠的 条评论
为什么被折叠?



