物件導向
抽象
- 只提供基本資訊,隱藏不必要的資訊。
- 降低設計的難度
封裝
- 隱藏實作細節
- 裡面的數據不提供給外部對象使用
- 外部對象只能通過接口溝通
繼承
- 被繼承的類叫基類,繼承的類叫子類。
- 基類應為一個抽象概念,為一個抽象類,代表不應直接實例化基類。
- 子類有基類的功能跟數據,減少重複。
多型
- 子類代替父類。
- 傳入參數定義成父類,傳入子類達到不同功能。
- 父類為抽象,符合針對抽象編程。
類的關係
- aggregation
- association
- dependency
- composition
- inheritance (generalization)
- implementation (Realization)
association
為 has a 的關係,A has a B 代表,A class 有一個成員變數為 B。
程式碼為 :
class A {
B b;
}
B b;
}
dependency
為 A references B (use a) 的關係,A references B 代表 A 在某個 function 內有用到 B,A 使用 B 的操作,但卻不擁有 B,可能是:
- 通過參數傳入
- 直接 new
- 返回值
- 靜態function
- 全域對象、變數、function
程式碼為 :
參數傳入
class A {
function t1(B b) {
function t1(B b) {
}
}
}
或直接 new
class A {
function t1() {
function t1() {
B b = new b();
}
}
}
或返回值
class A {
function t1() {
return new B();
}
}
aggregation
也是 has a (own a) 的關係,為 association 的子集,為較弱的 association ,A 聚合 B 代表,A 擁有 B,但是 B 可以獨立運作。
程式碼為 :
class A {
B b;
}
B b;
}
或
class A {
Array<B> b;
}
Array<B> b;
}
composition
是 has-a (part-of) 的關係,為 association 的子集,為較強的 association,A 組成 B 代表,A 擁有 B,B 是 A的一部份,A 被刪除之後,B 也跟著被刪除。
程式碼為 :
class A {
B b;
B b;
construct() {
b = new B();
}
}
}
association vs composition vs aggregation
這三個通常是語意或設計上的差異,跟代碼無關。
inheritance
繼承是 is a 的關係,A 繼承 B 代表 B 為 A 的子類,狗 class 繼承哺乳類 class,狗 is a 哺乳類。
程式碼:
class A extends B {
}
implementation
實現的意義是有能力做甚麼,A 實現 B 接口代表 A 必須實作 B 接口的所有 function,以供多型使用,也代表 A 有能力做 B 定義的事。
程式碼:
class A implements B {
}
留言
張貼留言