UML中类与类间的关系及实现
在面向对象的程序设计中,类之间主要有六种关系:继承, 组合, 聚合,关联, 依赖,实现。C属于面向过程语言,本身的语法不支持这些关系的实现,但可通过结构体和指针来实现这些关系。C++/Java/Python等语言原生支持面向对象的程序设计,可通过其语法来完成这些关系。此次结合UML与C++来掌握这些关系的实现与运用。
继承(Generalization)
继承是面向对象三大特征之一,其主要作用是实现代码的重用。继承可用"is a"表示,例鸟(类B)是动物(类A)。从继承父类的数量又可细分为单继承和多继承。(个人认为代码设计中,多继承的使用会使代码变得难以定位,因此尽可能减少多继承的使用)
类图
继承例程
// 单继承
class bird : public Animal
{
// 子类实现
};
// 多继承
class WangAnshi : public Poeat, public Politician
{
};
组合(Composition)
组合是将一个对象放到另一个对象里。是一种"has a"的关系,例如飞机(类b)有机翼(类a)。被组合的对象是一种强所属的关系,即两个对象具有相同的生命周期,一般情况下被组合的对象都不能脱离组合独自存在。例如飞机类和机翼类属于组合关系(假设一款机翼只能被一款飞机使用),在创建飞机对象时要同时或之后创建机翼对象;销毁飞机时,要同时或之前销毁机翼对象,两者都不能脱离组合独自存在。
类图
组合例程
class Wing
{
};
class Airplane
{
private:
Wing mWing[2];
};
聚合(Aggregation)
聚合是一种弱所属关系。不同与组合的是,聚合只是描述两者存在所属关系,且拥有者对象可控制被拥有者对象的生命周期;而组合不仅描述这种关系,而且被组合的对象生命周期相同。因此,组合是一种特殊的聚合(类似于正方形是特殊的长方形)。
例如: 装饰一个房间,可以在房间摆放花,且任何时候都可以拿走花。此时房间与花就是一种聚合的关系。
类图
聚合例程
class Flower
{
};
class Room
{
public:
void AddFlower();
void RemoveFlower();
private:
Flower mFlower;
};
关联(Association)
关联是一种弱关系。但并不为所属关系,两者是平等的类。关联仅表示一种类持有另一种类的关系。
例如:老师和学生是两种独立平等的类。老师可以持有学生类,访问其分数。学生可以持有老师类,了解老师教授的课程。这种关系又称为双关联。
类图
关联例程
class Teache
{
public:
class Student *mStudent;
};
class Student
{
public:
class Teacher *mTeacher;
};
依赖(Dependency)
一个对象的行为依赖另一种类。例如: 鸟的成长受水的影响,那么鸟与水就构成依赖关系。
C++语法中,通过将一个类作为另一个类成员函数参数的形式来实现两者的依赖关系。
类图
依赖例程
class Water
{
};
class Bird
{
public:
void GrowUp(Water &theWater);
};
实现(Realization)
实现对应的是面向对象的"接口"。例如手机都有自己的logo,不同的手机logo不同,每种手机都要实现自己的logo。
C++中,接口通过纯虚函数来实现,多态就是通过虚函数来实现的。
类图
实现例程
class Phone
{
public:
virtual string logoShow() = 0;
};
class Mate40 : public Phone
{
public:
string LogoShow();
};
总结
在初使用c++时,可能不会关注c++类之间的这些关系。但是当设计一个场景,一种模块的时候,可以通过类之间的这些关系帮助自己更加清晰的了解每个模块的关系。以及自己设计的模块牵涉到哪些关联模块?是通过什么行为关联的?可能会发生什么动作?这些动作的发生会产生哪些场景?
当把这些问题都搞清楚了,设计起来会大大降低漏掉的场景和隐藏的Bug。
网友评论