深入淺出UML類圖(三)

Liuwei-Sunny發表於2012-08-08

類與類之間的關係(2)

      2. 依賴關係

      依賴(Dependency)關係是一種使用關係,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關係。大多數情況下,依賴關係體現在某個類的方法使用另一個類的物件作為引數。UML中,依賴關係用帶箭頭的虛線表示,由依賴的一方指向被依賴的一方。例如:駕駛員開車,在Driver類的drive()方法中將Car型別的物件car作為一個引數傳遞,以便在drive()方法中能夠呼叫carmove()方法,且駕駛員的drive()方法依賴車的move()方法,因此類Driver依賴類Car,如圖1所示:

1 依賴關係例項

      在系統實施階段,依賴關係通常通過三種方式來實現,第一種也是最常用的一種方式是如圖1所示的將一個類的物件作為另一個類中方法的引數,第二種方式是在一個類的方法中將另一個類的物件作為其區域性變數,第三種方式是在一個類的方法中呼叫另一個類的靜態方法。圖1對應的Java程式碼片段如下:

public class Driver {
	public void drive(Car car) {
		car.move();
	}
    ……
}

public class Car {
	public void move() {
		......
	}
    ……
}

      3. 泛化關係

      泛化(Generalization)關係也就是繼承關係,用於描述父類與子類之間的關係,父類又稱作基類或超類,子類又稱作派生類。UML中,泛化關係用帶空心三角形的直線來表示。在程式碼實現時,我們使用物件導向的繼承機制來實現泛化關係,如在Java語言中使用extends關鍵字、在C++/C#中使用冒號“:”來實現。例如:Student類和Teacher類都是Person類的子類,Student類和Teacher類繼承了Person類的屬性和方法,Person類的屬性包含姓名(name)和年齡(age),每一個StudentTeacher也都具有這兩個屬性,另外Student類增加了屬性學號(studentNo)Teacher類增加了屬性教師編號(teacherNo)Person類的方法包括行走move()和說話say()Student類和Teacher類繼承了這兩個方法,而且Student類還新增方法study()Teacher類還新增方法teach()。如圖2所示:

2  泛化關係例項

      圖2對應的Java程式碼片段如下:

//父類
public class Person {
protected String name;
protected int age;

public void move() {
        ……
}

    public void say() {
    ……
    }
}

//子類
public class Student extends Person {
private String studentNo;

public void study() {
    ……
    }
}

//子類
public class Teacher extends Person {
private String teacherNo;

public void teach() {
    ……
    }
}

      4. 介面與實現關係

      在很多物件導向語言中都引入了介面的概念,如JavaC#等,在介面中,通常沒有屬性,而且所有的操作都是抽象的,只有操作的宣告,沒有操作的實現。UML中用與類的表示法類似的方式表示介面,如圖3所示:

介面的UML圖示

      介面之間也可以有與類之間關係類似的繼承關係和依賴關係,但是介面和類之間還存在一種實現(Realization)關係,在這種關係中,類實現了介面,類中的操作實現了介面中所宣告的操作。UML中,類與介面之間的實現關係用帶空心三角形的虛線來表示。例如:定義了一個交通工具介面Vehicle,包含一個抽象操作move(),在類Ship和類Car中都實現了該move()操作,不過具體的實現細節將會不一樣,如圖4所示:

實現關係例項

      實現關係在程式設計實現時,不同的面嚮物件語言也提供了不同的語法,如在Java語言中使用implements關鍵字,而在C++/C#中使用冒號“:”來實現。圖4對應的Java程式碼片段如下:

public interface Vehicle {
public void move();
}

public class Ship implements Vehicle {
public void move() {
    ……
    }
}

public class Car implements Vehicle {
public void move() {
    ……
    }
}

【作者:劉偉  http://blog.csdn.net/lovelion