26

我有这个 UML 关联类。注意:横线为实线,竖线为虚线。

 ---------                  ---------
|         |*(a)        *(b)|         |
| CLASS   |________________|  CLASS  |
|STUDENT  |     |          |  COURSE |
 ---------      |           ---------
                |*(c)
          ______|______
         |             |
         |             |
         |  CLASS      |
         | TRANSCRIPT  |
         |_____________|

我理解这种关系,但是在将这个 UML 实现为代码时遇到了一些问题。Student我可以实现类和类Course到代码之间的关系。这是我的代码:

class Student {
  Vector<Course> b;
}

class Course {
   Vector<Student> a;
}

但是,在课堂上Transcript,我不太了解如何在代码中使用这个类。它是 classStudentCourse. 所以,如果这是真的,那么代码将是:

class Student {
  Vector<Course> b;
  Vector<Transcript> c;
}

class Course {
  Vector<Student> a;
  Vector<Transcript> c;
}

这是真的吗?如果这是错误的,请教我如何实现这个 UML。

谢谢 :)

4

3 回答 3

37

首先,不要使用 Vector,因为它是一个老类,不应该再使用超过 10 年。使用 aSet或 a List

如果Transcript该类包含有关学生参加课程的方式的信息(例如,其订阅课程的日期),您可以像这样实现它:

class Student {
    Set<Transcript> transcripts;
}

class Transcript {
    Student student;
    Course course;
    Date subscriptionDate;
}

class Course {
    Set<Transcript> transcripts;
}

这并不妨碍您在 Student 中提供返回所有课程的方法: 

public Set<Course> getCourses() {
    Set<Course> result = new HashSet<Course>();
    for (Transcript transcript : transcripts) {
        result.add(transcript.getCourse());
    }
    return result;
}

如果Transcript不包含任何信息,那么它可能用于对这些类如何在数据库表中进行映射进行建模,其中在两个表之间建立多对多关联的唯一方法是使用包含 ID 的连接表两个关联的表。

于 2012-11-18T19:50:58.943 回答
6

我知道这个问题很老了,但我有一种比在关联类中嵌入 n..1 关系更方便的方法:

public class Transcript {
    //Transcript's properties
} 

public class Course {

    private Map<Student, Transcript> transcriptsByStudent;
}

public class Student {

    private Map<Course, Transcript> transcriptsByCourse;
}
于 2017-09-02T20:18:19.500 回答
1

再补充一点,在您的模型上,您表示关联类的多重性。这是不必要的,因为关联类就是关联本身,原来两个类的多重性关系会满足。

于 2017-02-07T23:26:44.077 回答