在面向对象设计中建立父子关系

时间:2014-12-25 14:04:36

标签: c# oop composition model-associations

假设我们想要模拟参加课程学生。每个学生最多应该一次参加一门课程,一门课程可以包含多个学生(典型的一对一协会)。进一步假设这种关联应该是双向的,即我们应该能够从学生导航到课程,反之亦然。

很自然地,我们会有两个类,Student(持有对指定课程的引用)和Course(包含一组学生)。但是我们如何组成对象图?具体来说,我们应该定义哪些类来建立学生和班级之间的链接?第一个明显的选择是在Add类上定义通用的Course方法:

class Course
{
    public void Add(Student student) { ... }
}

但你可以在Student类上同样定义一个操作:

class Student
{
    public void Attend(Course course) { ... }
}

(当然还有更多选项,比如将Course类的实例传递给Student的构造函数,但这不是重点:

比较这两种选择,我个人认为第二种选择更具吸引力,因为student.Attend(course)传递的信息多于course.Add(student),因为Attend比通用Add具有更多意义。但是我还没有遇到过一个使用这种向容器对象添加元素的样式的API,这让我得出结论,我错过了一些重要的东西。

所以,除了第二种选择不常见外,它的缺点是什么?或者它不像我想的那么罕见?

1 个答案:

答案 0 :(得分:0)

在大多数情况下,假设学生能够在不满足课程规定的任何要求的情况下参加课程是不切实际的。

更完整的协议将从学生申请课程开始。然后,课程将接受或拒绝申请,并通过注册学生或不通知他们做出相应的行动,无论它是什么。

如果学生收到接受回复,他们可能会选择"记录"接受申请的课程。这个动作只是为了学生的便利,因为已经完成了正式的步骤。因此,如果我们同意由学生来跟踪他们参加的课程(现在和过去),那么很明显,参加方法不是强制性的,因此不应该是主要的。