Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 应用面向对象聚合概念的正确方法_Java_Oop_Aggregation_Composition - Fatal编程技术网

Java 应用面向对象聚合概念的正确方法

Java 应用面向对象聚合概念的正确方法,java,oop,aggregation,composition,Java,Oop,Aggregation,Composition,我正在修复我系统的OOP设计,因为我认为体系结构有缺陷。我必须为正确的面向对象应用程序重写类,如继承、接口和聚合/组合,以实现正确的代码重用和关系 假设我有课程班、学科班、学年班、年级班,我想将HAS-A(Aggregation)的概念应用为 课程HAS-A科目 课程HAS-AYear级别 课程HAS-A学年 科目HAS-A学年 受试者HAS-AYear级别 这样做是否足够: public class Curriculum { SchoolYear schoolYear = new Sc

我正在修复我系统的OOP设计,因为我认为体系结构有缺陷。我必须为正确的面向对象应用程序重写类,如继承、接口和聚合/组合,以实现正确的代码重用和关系

假设我有课程班、学科班、学年班、年级班,我想将
HAS-A
Aggregation)的概念应用为

课程
HAS-A
科目 课程
HAS-A
Year级别 课程
HAS-A
学年 科目
HAS-A
学年 受试者
HAS-A
Year级别

这样做是否足够:

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();
   }
我不认为这是正确的,因为我不认为重新创建同样的方法有什么意义,只是说课程类
有-A
YearLevel

考虑到课程由年级、科目和学年组成,我如何实施或应用
HAS-A
概念

在这一点上,我不能继续使用二传手和传接手,因为我不知道哪种方法是正确的。我希望能够正确地应用OOP概念


如果您能给我任何建议或帮助,我将不胜感激

第二种方法似乎是最好的,第一种和第三种方法似乎在类之间有很多不推荐的依赖性


请注意,SchoolYeal和YearLevel应该是接口或抽象,而不是实现,否则我们仍然会陷入依赖性问题。

第二种方法似乎是最好的,第一种和第三种方法似乎在类之间有很多不推荐的依赖性

请注意,SchoolYeal和YearLevel应该是接口或抽象,而不是实现,否则我们仍然会陷入依赖性问题。

关联、聚合和组合的“正确”概念都是关于生命周期和关系的。因此,最重要的问题是“哪些对象可以独立于哪些对象而存在?”以及“两个对象(A-owns-B、A-knows-B、A-component-of-B)之间的关系有多强?”

如果你想为你的班级
课程
(作为所有者)使用聚合概念,这意味着
课程
将有一个
学年
,也将有一个
年级
,但它们都有自己的生命周期。因此,如果您销毁
课程
,其他对象仍将存在。这可以像第二种方法一样实现:

public class Curriculum {

   SchoolYear schoolYear;
   YearLevel yearLevel;

   public Curriculum(SchoolYear sy, YearLevel yl ){
       this.schoolYear = sy;
       this.yearLevel = yl;
   }
}
如果你想在它们之间建立更紧密的关系,你需要一个组合概念,其中a是由B组成的,所以它们的生命周期是相同的。如果你摧毁了A,你也摧毁了B。这意味着B不属于A就不可能存在。就像一座建筑是由房间组成的,但是一个房间可以没有建筑而存在吗? 要绘制生命周期图,您需要像第一种方法一样,在实例化
课程时创建
YearLevel
SchoolYear

依我看你对这件事没意见。 如果将<>代码>主题<代码>添加到<代码>课程中,你应该考虑使用构图。

< P> < <强>关联< <强> > <强>聚合> /强>和<强>构图< /强>都是关于生命周期和关系的。因此,最重要的问题是“哪些对象可以独立于哪些对象而存在?”以及“两个对象(A-owns-B、A-knows-B、A-component-of-B)之间的关系有多强?”

如果你想为你的班级
课程
(作为所有者)使用聚合概念,这意味着
课程
将有一个
学年
,也将有一个
年级
,但它们都有自己的生命周期。因此,如果您销毁
课程
,其他对象仍将存在。这可以像第二种方法一样实现:

public class Curriculum {

   SchoolYear schoolYear;
   YearLevel yearLevel;

   public Curriculum(SchoolYear sy, YearLevel yl ){
       this.schoolYear = sy;
       this.yearLevel = yl;
   }
}
如果你想在它们之间建立更紧密的关系,你需要一个组合概念,其中a是由B组成的,所以它们的生命周期是相同的。如果你摧毁了A,你也摧毁了B。这意味着B不属于A就不可能存在。就像一座建筑是由房间组成的,但是一个房间可以没有建筑而存在吗? 要绘制生命周期图,您需要像第一种方法一样,在实例化
课程时创建
YearLevel
SchoolYear

依我看你对这件事没意见。
如果你将<>代码>科目<代码>添加到你的代码>课程中,你应该考虑使用构图。

x 3不是聚合。您构建的新对象在返回后与它的“父对象”不再有关系。在1和2之间,您可以讨论组合/聚合和关联之间的差异,但这是毫无意义的。做最适合你的事情。这些学年级和年级级的建设者没有理由吗?哪一年?哪一层?这些是价值对象还是可以共享并拥有自己的身份?#3不是聚合。您构建的新对象在返回后与它的“父对象”不再有关系。在1和2之间,您可以讨论组合/聚合和关联之间的差异,但这是毫无意义的。做最适合你的事情。这些学年级和年级级的建设者没有理由吗?哪一年?哪一层?这些是价值对象还是可以共享并拥有自己的标识?Wny不能实现它们吗?我不建议使用抽象类,因为这样你就不能像问题中那样实现它们了。我的想法是忽略对象的实现来降低两个类之间的依赖性。在第一种方法中,如果