1. 什么是聚合?
在面向对象编程中,聚合(Aggregation)是一种关联关系,表示对象之间的“整体-部分”关系。也就是说,一个对象包含另外一个对象,被包含的对象是“整体”,而包含其他对象的对象是“部分”。
举个例子,我们可以将班级和学生之间的关系看作是一种聚合。一个班级包含多个学生,而一个学生属于一个班级。这种关系可以用UML类图来表示,如下图:
2. 聚合与组合的区别
在面向对象编程中,聚合与组合(Composition)是两种比较常见的关联关系。它们有很多相似之处,但也有一些重要的区别。
2.1 聚合与组合的相似之处
它们都是一种关联关系,用来表示对象之间的“整体-部分”关系。
都可以用UML类图来表示。
2.2 聚合与组合的区别
组合是一种更强的关联关系。如果两个对象之间是组合关系,那么被包含的对象只能属于一个“整体”对象,而不能属于其他对象。例如,一个车是由引擎、轮胎和车身等部分组成的,这些部分只能属于这个车,不能属于其他车。
而聚合关系中被包含的对象是可以属于多个“整体”对象的。例如,在上面的班级和学生的关系中,一个学生可以属于多个班级。
在UML类图中,组合关系通常用实心菱形来表示,而聚合关系则用空心菱形来表示。
3. C#中如何实现聚合关系?
C#中实现聚合关系的方式有多种。下面我们以班级和学生为例,介绍两种常见的方式。
3.1 列表/List
一个班级包含多个学生,我们可以使用List来保存这些学生对象。
class Student
{
public string Name { get; set; }
}
class Class
{
public List<Student> Students { get; set; }
public void AddStudent(Student student)
{
Students.Add(student);
}
}
在上面的代码中,Class类中的Students属性是一个List<Student>类型的列表,用于保存学生对象。在AddStudent方法中,我们可以直接向Students列表中添加学生对象。
3.2 构造函数/Constructor
我们也可以通过构造函数来实现聚合关系。在班级的构造函数中传入多个学生对象,并保存到Students列表中。
class Student
{
public string Name { get; set; }
}
class Class
{
public List<Student> Students { get; set; }
public Class(List<Student> students)
{
Students = students;
}
}
在上面的代码中,Class类的构造函数接受一个List<Student>类型的参数,用于保存学生对象。在创建班级对象时,我们可以通过这个构造函数传入多个学生对象。
4. 总结
通过本文,我们了解了什么是聚合关系,在面向对象编程中如何使用聚合关系,以及C#中如何实现聚合关系。