【发布时间】:2016-09-10 16:15:48
【问题描述】:
我正在修复我的系统的 OOP 设计,因为我认为架构存在缺陷。我必须为正确的面向对象应用程序重写类,例如它的继承、接口和聚合/组合,以实现正确的代码重用和关系。
假设我有课程班、学科班、学年班、年级班,我想将HAS-A(聚合)的概念应用为
课程HAS-A主题
课程HAS-A 年级
课程HAS-A 学年
主题HAS-A学年
学科HAS-A年级
这样就够了吗:
public class Curriculum {
SchoolYear schoolYear = new SchoolYear();
YearLevel yearLevel = new YearLevel();
}
或使用构造函数对其进行初始化:
public class Curriculum {
SchoolYear schoolYear;
YearLevel yearLevel;
public Curriculum(SchoolYear sy, YearLevel yl ){
this.schoolYear = sy;
this.yearLevel = yl;
}
或者只是在一个方法中创建一个类的实例,比如:
public DefaultListModel getAllYearLevel(){
YearLevel yl = new YearLevel();
return yl.getAllYearLevels();
}
我认为这是不正确的,因为我没有看到重新创建相同方法的意义,只是说 Curriculum class HAS-A YearLevel。
考虑到课程由年级、学科和学年组成,我如何实施或应用HAS-A 概念?
此时我无法继续使用 setter 和 getter,因为我不知道哪种方式是正确的。我希望能够正确应用 OOP 概念。
如果有任何建议或帮助,我将不胜感激。
【问题讨论】:
-
#3 不是聚合。一旦您返回它,您构建的新事物就与它的“父”不再有任何关系。在 1 和 2 之间,您可以讨论组合/聚合和关联之间的差异,但这是没有意义的。做最适合您情况的事情。
-
这些 SchoolYear 和 YearLevel 构造函数没有参数吗?哪一年?哪个级别?这些值对象是共享的还是可以共享并拥有自己的身份?
标签: java oop aggregation composition