类的关系
基本概念
在UML类图中,类一般由三部分组成:
(1)类名 :每个类都必须有一个名字,类名是一个字符串。
(2) 属性 :属性是指类的性质,即类的成员变量。一个类可以有任意多个属性,也可以没有属性。UML规定属性的表示方式为:
可见性 名称:类型 [ = 缺省值 ]
其中:
1、可见性:表示该属性对于类外的元素是否可见,包括公有(public)、私有(private)和受保护(protected)三种。
表示可见性的符号
- ‘+’: public
- ‘-’ :private
- ‘#’: protected
2、名称:表示属性名称,用一个字符串表示。
3、类型:表示属性的数据类型。可以是基本数据类型,也可以是用户自定义类型。
4、缺省值:是可选的,表示属性的初始值。
(3)方法 :是类的成员方法。UML规定操作的表示方式为:
可见性 名称(参数列表) [ : 返回类型]
其中:
1、可见性:与属性的可见性定义相同。
2、名称:方法名,用一个字符串表示。
3、参数列表:方法的参数。参数个数是任意的,多个参数之间用逗号隔开。
4、返回类型:是可选的,表示方法的返回值类型,依赖于具体的编程语言,可以是基本数据类型,也可以是用户自定义类型,还可以是空类型(void),如果是构造方法,则无返回类型。
举例:
class BMI
{
public:
BMI(const string& newName, int newAge,
double newWeight, double newHeight);
BMI(const string& newName, double newWeight, double newHeight);
double getBMI() const;
string getStatus() const;
string getName() const;
int getAge() const;
double getWeight() const;
double getHeight() const;
private:
string name;
int age;
double weight;
double height;
};
类之间的关系
依赖(Dependency)
一个类A使用到了另一个类B,类B的变化会影响到A,但类B不属于类A;比如我写作业,要用到笔,我和笔之间的关系就是依赖。
类A与类B彼此独立,而类B是类A中
1、成员函数的一个参数
2、成员函数的一个局部变量
3、A对B静态方法的调用
#include <iostream>
using namespace std;
class Pen
{
private:
char color;
public:
void write(){cout<<"writing";}
static void finish()
{//静态方法
cout<<"You have finished your homework!";
}
};
class Myself
{
private:
char name;
int age;
public:
void HomeWork(Pen p);//成员函数的一个参数
void use()
{
Pen p;//Pen是Myself中成员函数的一个局部变量
cout<<"I am ";
p.write();
cout<<endl;
}
void award()
{
Pen::finish();//Myself对Pen中静态方法的调用
cout<<"Go to relax now!";
}
};
int main()
{
Myself a;
a.use();
a.award();
return 0;
}
继承(泛化(Generalization))
is-a 的关系。子类继承父类,则子类可以拥有父类的某一些状态和行为,也能进行功能的扩展。比如数学是一门学科,数学拥有学科的属性,也有自己的属性。
class Subject
{
};
class Math :public Subject
{
};
实现(Realization)
实现对应的是面向对象中的"接口",即动物都要移动,但是每种移动的方式不一样,鸟要实现自己独有的移动的方法。
在C++中,接口通过的纯虚函数来实现,C++的多态就是通过虚函数来实现的。
class Animal{
public:
vitual void move();
};
class Bird: public Animal{
void move(){
//鸟的移动方式,飞
}
};
关联(Assocation)
两个类、或者类与接口之间一种拥有的关系;一般的关联是平等的、平级的、没有整体和部分关系的,比如说我和我的同学。
关联可以是单向、双向的,双向关联有两个箭头或者没有箭头,单向关联有一个箭头,表示关联的方向,关联关系以实例变量的形式存在,在每一个关联的端点,还可以有一个基数(multiplicity),表明这一端点的类可以有几个实例;
被关联类B和关联类A
1、B以类属性的形式出现在A中
2、A引用了一个类型为B的全局变量
聚合(Aggregation)
聚合关系是一种特殊的关联关系,是强关联关系,是整体和部分之间的关系,即has-a 的关系。整体与部分之间是可分离的,部分可以属于多个整体对象,也可以为多个整体对象共享,当整体的生命周期消亡后,部分仍然存在;比如,我在文具店打工,文具店拥有我这个员工,我还可以在书店打工,还可以在饭馆打工。但如果文具店倒闭了,我仍然存在。
A has a B:
1、B是A的成员变量
class Person
{
};
class Bookstore
{
private:
Person p;
};
组合(Composition)
组合是一种特殊的聚合,他同样体现整体与部分间的关系,但是一种contains-a的关系,这种关系比聚合更强;而且整体与部分是不可分的,当整体的生命周期消亡后,部分也就不复存在了;比如学校里面有班级,如果学校没有了,那学校里的班级就自然没有了。
A contains B
1、成员变量
class Classroom
{
};
class School
{
public:
Classroom c[10];
};
参考: https://www.cnblogs.com/xiaojiang1025/p/6677978.html
https://blog.csdn.net/weixin_42927264/article/details/82963556
https://www.cnblogs.com/mabaoqing/p/10316120.html