类间关系
类之间的关系
泛化(Generalization)
泛化关系:是一种继承关系,表示一般与特殊的关系,通过继承增加子类的能力,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。
箭头指向:带三角箭头的实线,箭头指向父类
Fruit <|-- Apple
实现(Realization)
实现关系:是一种类与接口的关系,表示类是接口所有特征和行为的实现。
箭头指向:带三角箭头的虚线,箭头指向接口
State<|..BattleState
依赖(Dependency)
依赖关系:是一种使用的关系,即一个类的实现需要另一个类的协助,这种关系具有偶然性、临时性。类A要完成某个功能引用了类B,则类A依赖类B。被依赖的类会影响到依赖类,所以要尽量不使用双向的互相依赖。
代码表现:类A的某个成员函数的返回值、局部变量、方法的参数或者对静态方法的调用,则表示类A引用了类B。
箭头及指向:带箭头的虚线,指向被依赖者
Computer<..Student
class Computer
{
public:
static void start(){
cout<<"电脑正在启动"<<endl;
}
};
class Student
{
public:
//返回值构成依赖
Computer& program();
//形参构成依赖
void program(Computer&);
void playGame()
{
//局部变量构成依赖
Computer* computer=new Computer;
...
//静态方法调用构成依赖
Computer::star();
}
};
关联(Association)
关联关系:是一种拥有的关系,它使一个类知道另一个类的属性和方法,体现为两个类、或者类与接口之间语义级别的一种强依赖关系;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
代码体现:成员变量
箭头及指向:带普通箭头的实心线,指向被拥有者(被关联)
Student "n" --> "n" Teacher
class Teacher;
class Student{
public:
Teacher teacher; //成员变量
void study();
}
聚合(Aggregation)
聚合关系:整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
代码体现:成员变量
箭头及指向:带空心菱形的实心线,菱形指向整体
Classes "1" o-- "n" Student
class Student;
class Classes{
public:
Student* student;
Classes(Student* stu):student(stu){}
};
组合(Composition)
组合关系:整体与部分的关系,但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。
代码体现:成员变量
箭头及指向:带实心菱形的实线,菱形指向整体
Student "1" *-- "n" Heart
class Heart;
class Student
{
public:
Heart* heart;
Student()
{
heart=new Heart();
}
~Student()
{
delete heart;
}
};
各种关系的强弱顺序
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
氧气 <.. 动物
动物 ..> 水
动物 <|--鸟
鸟 "1" *-- "2" 翅膀
鸟 <|-- 鸭子
鸟 <|-- 大雁
鸟 <|-- 企鹅
大雁 ..|> 飞翔
大雁 "n" --o "1" 雁群
鸭子 --|> 唐老鸭
唐老鸭 ..|> 讲话
企鹅 "1" --> "1" 气候
组合和聚合的区别
组合和聚合都属于关联,所以它们之间难免有相似之处,区别举例来说明: 大雁喜欢热闹害怕孤独,所以它们一直过着群居的生活,这样就有了雁群,每一只大雁都有自己的雁群,每个雁群都有好多大雁,大雁与雁群的这种关系就可以称之为聚合。另外每只大雁都有两只翅膀,大雁与雁翅的关系就叫做组合。由此可见,聚合的关系明显没有组合紧密,大雁不会因为它们的群主将雁群解散而无法生存,而雁翅就无法脱离大雁而单独生存——组合关系的类具有相同的生命周期。