仅供学习参考,如有不足之处,请予指正。
面向对象 = 对象(Object)+ 分类(Classification)+ 继承(Inheritance)+消息通信
1、类和对象
一个类定义了一组大体上相似的对象;包含一组对象的共同行为和属性;类时在对象之上的抽象,对象是类的具体化,是类的实例
类分为:实体类、接口类(边界类)、控制类
实体类:表示现实世界真实的实体,如人、物等
接口类(边界类):对象为用户提供一种与系统合作交互的方式,分为人和系统两大类,其中人的接口可以是显示屏、窗口、web窗口、对话框、菜单、列表框、其他显示控制、条形码、二维码或者用户与系统交互的其他方法;系统接口涉及把数据发送到其他系统,或者从其他系统接受数据
控制类:对象用来控制活动流,充当协调者
一般类和特殊类:特殊类是一般类的子类,如“汽车”、“轮船”、“飞机”都是一种“交通工具”;“轿车”、“货车”是一种“汽车”
对象是基本的运行实体,包括数据(属性)、作用于数据的操作(行为)
每个实体都是对象
2、消息
对象之间进行通信的一种构造
消息传递:对象——发送消息(执行某些活动的信息)——接收的对象不需要经过解释,然后予以响应
3、继承
父类和子类之间共享数据和方法的机制
一个父类有多个子类,子类是父类的特例
单重继承:子类B只从一个父类A得到继承
多重继承:一个子类有两个或更多个父类
4、多态
不同对象收到同一消息可以产生完全不同的结果
通用的:参数的、包含的
特定的:过载的、强制的
5、动态绑定
在程序运行时进行的,一个对象发送消息请求服务时,要根据接收对象的具体情况将请求操作与实现的方法进行连接
6、面向对象分析(OOA)
目的:为了获得对应问题的解决
五个活动:认定对象、组织对象、描述对象间的相互作用、确定对象的操作、定义对象的内部信息
认定对象:按自然存在的实体确定对象
组织对象:将相关对象抽象成类
对象间的相互作用:一个对象是另一个对象的一部分、一个对象与其他对象间的通信关系等,由一个对象解释另一个对象以及一个对象如何生成另一个对象
基于对象的操作:将几个对象的信息连接起来
7、面向对象设计(OOD)
将OOA创建的分析模型转换为设计模型,定义系统构造蓝图
遵循抽象、信息隐蔽、功能独立、模块化等设计准则
活动:识别类和对象、定义属性、定义服务、识别关系、识别包
原则:单一责任原则、开放-封闭原则、里氏替换原则、依赖倒置原则、接口分离原则、共同封闭原则、共同重用原则、无环依赖原则、稳定依赖原则、稳定抽象原则
单一责任原则(SRP):就一个类而言,应该仅有一个引起它变化的原因;当需要修改某一个类的时候原因有且只有一个,让一个类只做一种类型责任
开放-封闭原则(OCP):软件实体(类、模块、函数等)应该是可以扩展的,即开放;但是不可修改,即封闭
里氏替换原则(LSP):子类型必须替换掉他们的基类型
依赖倒置原则(DIP):抽象不应该依赖于细节,细节依赖于抽象
接口分离原则(ISP):不应该强迫客户依赖于它们不用的方法;接口属于客户,不属于它所在的类层次结构:即依赖于抽象,不依赖于具体
共同封闭原则(CCP):包中的所有类对于同一类性质的变化应该是共同封闭的;一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响
共同重用原则(CRP):一个包中的所有类应该是共同重用的;如果重用了包中的一个类,那么就要重用包中所有类
无环依赖原则(ADP):在包依赖关系图中不允许存在环,即包之间的结构必须是一个直接的五环图形
稳定依赖原则(SDP):朝着稳定的方向进行依赖
稳定抽象原则(SAP):包的抽象程度应该和其稳定程序一致
8、面向对象程序设计(OOP)
类
class Employee{ private://私有 char * Name; int age; public: void Change(char *name, int age); Employee(char *name, int age);//构造函数 ~Employee();//析构函数 };
继承和类的层次结构
class Manager:public Employee{ int level; public: void ChangeLevel(int n); Manage(char *name, int age, int level); ~Manage(); };
对象、消息传递和方法
Manage ml; ml.ChangeLevel(2);
对象自身引用
Manage::ChangeLevel(2);
重置:在子类中重新定义父类中已经定义的方法,通过虚函数的定义来重置声明实现动态绑定 ,多态机制
class Employee{ protected: char *name; int age; public: void Change(char *name, int age); //虚函数 virtual void Retire(); Employee(char *name, int age); ~Employee(); }; class Manage:public Employee{ int level; public: void Retire();//重置从父类那继承的Retire方法 virtual void ChangeLevel(int n);//虚函数,供Manage的子类重置 Manage(char *name, int age, int level); ~Manage(); };
类属类:参数多态机制,类属template,类的模板
template <class T> class Vector{ T *v; int sz; public: T&operator[](int i);//运算符过载 Vector(int VectorSize); /*...*/ };
<class T>中的class用来说明T是一个类型参数,但并不意味着T一定是一个类,也可以是基本类型
无实例的类,相当于接口
class Person{ protected: char *name; int age; /*...*/ public: void Change(char *name, int age); virtual void PrintOn() = 0;//纯虚函数,接口 Person(); Person(char *name, int age, char *addr, char *tele);//过载的构造函数 };
9、面向对象测试
四个层次:
算法层——测试类中定义的内阁方法,单元测试
类层——测试封装在同一个类中的所有方法与属性之间的相互作用,模块测试
模板层——测试一组协调工作的类之间的相互作用,集成测试
系统层——把各个子系统组装成完整的面向对象软件系统,在组装过程中同时进行测试