聚合是一個整體/部分關係。如果全不存在不再,但部分將仍然存在類定義中的聚合和組合表示?
但在組成上如果全不存在不再,但部分將不復存在
例如,一所大學擁有各部門(如化學),每個部門都有一批教授。如果大學關閉,部門將不復存在,但這些部門的教授將繼續存在。因此,大學可以被看作是一個部門的組成部分,而部門則由教授組成。
我的問題在這裏我們將如何實際定義java中的大學,系和教授的類定義,它也描述了聚合和組合行爲?
聚合是一個整體/部分關係。如果全不存在不再,但部分將仍然存在類定義中的聚合和組合表示?
但在組成上如果全不存在不再,但部分將不復存在
例如,一所大學擁有各部門(如化學),每個部門都有一批教授。如果大學關閉,部門將不復存在,但這些部門的教授將繼續存在。因此,大學可以被看作是一個部門的組成部分,而部門則由教授組成。
我的問題在這裏我們將如何實際定義java中的大學,系和教授的類定義,它也描述了聚合和組合行爲?
構圖和聚合的概念用UML中的菱形箭頭顯示,但是當這些概念以編程語言實現時,可能會從一種編程語言更改爲另一種編程語言。
一般來說,在Java,C#或Delphi等編程語言中,兩種情況都由對象引用表示。每個對象都有一個「生命週期」(「創建」,「做東西」,「銷燬」)。
package Universities;
class ProfessorClass {
string FirstName;
string LastName;
// constructor
public ProfessorClass(string AFirstName, string ALastName) {
FirstName = AFirstName;
LastName = ALastName;
}
} // class ProfessorClass
class DepartmentClass {
string Name;
string Description;
// constructor
public DepartmentClass(string AName, string ADescription) {
Name = AName;
Description = ADescription;
}
} // class DepartmentClass
class UniversityClass {
// here doesn't look different:
// aggregation
ProfessorClass[] Professors;
// composition
DepartmentsClass[] Departments;
// constructor
public UniversityClass() {
// "UniversityClass" is in charge of creating parts
// here doesn't look different:
DepartmentsClass = new DepartmentsClass[]();
ProfessorClass = new ProfessorClass[]();
}
public addDepartment(string AName, string ADescription)
{
// composition, whole class is in charge of adding parts:
DepartmentClass Dept = new DepartmentClass(AName, ADescription);
DepartmentsClass.add(Dept);
}
public deleteDepartment(string AName)
{
// composition, whole class is in charge of deleting parts:
DepartmentsClass.delete(AName);
}
public addProfessor(ProfessorClass AProfessor)
{
// aggregation, whole class only reference other objects,
// but, may look like they where parts
ProfessorClass.add(AProfessor);
}
public static void main(String[] args) {
UniversityClass MyUniversity = new UniversityClass();
// composition, internal, maintained by main class
MyUniversity.addDepartment("History", "Very Boring");
MyUniversity.addDepartment("Music", "Only if you like it");
MyUniversity.addDepartment("Astronomy", "night living people");
// aggregation, external, referenced by main class,
// maintained independently
ProfessorClass Professor1 = new ProfessorClass("Jane", "Doe");
ProfessorClass Professor2 = new ProfessorClass("Mike", "Smith");
ProfessorClass Professor3 = new ProfessorClass("Louise", "Kent");
MyUniversity.addProfessor(Professor1);
MyUniversity.addProfessor(Professor2);
MyUniversity.addProfessor(Professor3);
} // static void main(...)
} // class UniversityClass
在組合物中,由其它的對象組成的「整體」的對象(「份」),是負責創建,使用&破壞其部件。 「整體」對象負責其每個「部分」的「生命週期」。
在聚合中,引用其他對象(「聚合」)的「整體」對象通常可能看起來類似於「部件」(組合),而不是由剛剛分配或取消分配的主對象創建或銷燬。主對象不直接控制其他對象,只需添加或刪除引用。
有時你可能會從其他開發者那裏挑選代碼,並且可能會看到兩個想法,混淆,並且不能區分使用了哪個概念。
讓我們來設置條款。聚合是UML標準中的一個元語言,並且意味着BOTH構成和共享聚合,簡稱爲共享。通常它被錯誤地命名爲「聚合」。它是壞的,因爲構圖也是一個聚合。據我所知,你的意思是「共享」。
此外從UML標準:
複合 - 指示該屬性被聚集複合地, 即,複合物具有用於存在和 存儲所構成的對象(零件)的責任。
所以,大學cathedras關聯是一種組合物,因爲cathedra的不存在出來大學(IMHO)的
共享聚合的精確語義因應用領域和 建模而變化。
即所有其它協會可以得出共享聚合,如果你只以下到你的或別人的一些原則。也看here。
嗨Umlcat我正在尋找java中的這些對象的類定義有更好的理解。 –
@Mohit Gupta完成,它有一個很大的例子,需要時間來編寫代碼,它不能完全運行,只是一個近似的例子 – umlcat
感謝umlcat。但是我對上面的例子還有一個問題,那就是聚合和關聯之間有什麼區別?看起來我們可以說大學與教授有聯繫,我們也可以說大學是教授的聚合。哪一個是對的? –