關聯關系是類與類之間最常用的一種關系,它是一種結構化關系,用于表示一類對象與另一類對象之間有聯系。它展現的是兩個類、或者類與接口之間語義級别的一種強依賴關系,比如我和我的朋友。這種關系比依賴更強、不存在依賴關系的偶然性、關系也不是臨時性的,一般是長期性的,而且雙方的關系一般是平等的,關聯可以是單向、雙向的。表現在代碼層面,為被關聯類B以類屬性的形式出現在關聯類A中,也可能是關聯類A引用了一個類型為被關聯類B的全局變量。
在UML類圖中,用實線連接配接有關聯的對象所對應的類,在使用Java、C#和C++等程式設計語言實作關聯關系時,通常将一個類的對象作為另一個類的屬性。
1.雙向關聯。
預設情況下,關聯是雙向的,雙向的關聯可以有兩個箭頭或者沒有箭頭。
2.單向關聯。
類的關聯關系也可以是單向的,單向關聯用帶箭頭的實線表示。
單向關聯和雙向關聯的UML示例圖如下所示::
【說明】:上圖中,Teacher與Student是雙向關聯,Teacher有多名Student,Student也可能有多名Teacher(兩個類連線下面的*表示多對多的關系)。但Student與Course間的關系為單向關聯,一名Student可能有多門Course,課程是個抽象的東西,是以不擁有Course。
單向關聯和雙向關聯的示例代碼如下(Teacher、Student類的定義):
Teacher.h檔案:
1 @class Student;
2 @interface Teacher : NSObject
3 {
4 Student *_student;
5 }
6
7 @property (nonatomic, retain) Student *student;
8
9 @end
Student.h檔案:
1 #import "Course.h"
2
3 @class Teacher;
4 @interface Student : NSObject
5 {
6 Teacher *_teacher;
7 Course *_course;
8 }
9
10 @property (nonatomic, retain) Teacher *teacher;
11 @property (nonatomic, retain) Course *course;
12
13 @end
【注意】:可能大家注意到了,在Student類的定義中,包含Course類用的是:#import "Course.h";而包含Teacher類用的是:@class Teacher;。這是因為Teacher類和Student是雙向關聯,如果直接用import,那麼在編譯的時候,編譯器會報錯,至于@class和#import的差別,在後面會進行介紹。
3.自關聯。
在系統中可能會存在一些類的屬性對象類型為該類本身,這種特殊的關聯關系稱為自關聯。比如我們在資料結構中描述樹結構,會建一個節點Node類,Node類有一個指針父節點也是Node類型。
源碼下載下傳 傳回目錄
循自然之道,撫浮躁之心