5.3 物件導向概論


Object Oriented:

int x; (type 變數)
person P; (類別 物件)

  • Ex:
1
2
3
4
person p;
p.h = 180
p.w = 80;
p.walk();

why O.O

  • 可用以反應出真實世界的情況, 使程式的可讀性更佳, 日後的可維護性亦更好
  • 彈性好, 但 performance 差

物件(object)

  • Def:
    • an object is an instance of a class => 指物件為類別的實體
    • each object 是獨立的, 滿足唯一性(unique)
  • 就程式而言物件是
    1. 參與程式執行的單位
    2. 為一變數會佔用 Mem.space
    3. dynamic: 指會隨執行而更動其狀態

類別(class)

  • Def:
    • 將具相同屬性及行為的 object 加以抽象化定義
  • 其中:
    • attribute: 靜態描述(特徵值), height, weight, 單眼皮, 雙眼皮
    • behavior(operation in c++, method in java): 動態描述 => 作用在屬性上
  • 就程式而言類別是:
    • ADT (Abstract Data Type)
    • 為靜態單位, 只佔用一份 Mem. space
    • 為物件的實施藍圖
  • 概念:
    • 圖:
    • Note: Object 之間溝通採用 “Message Passing” (因為物件間是獨立的, 無共享Mem.)

Object Oriented 四大特色

  1. Data Abstraction 資料抽象化
    • 將物件細節排除, 擷取共通的 attribute 及 operation, 加以抽象化定義
    • 在定義(抽象化)過程, 會忽略和問題無關的部分
  2. Encapsulation 封裝
    • Def:
      • 可將 class 中部分的 attribute 及 operation 隱藏, 避免外界直接取用
      • 一般會用一公開的管道使外界可做間接存取, 以便管控正確性
    • 優點:
      1. 確保私有 data 不受外界影響 => 可避免不當操作發生, 如 …heart
      2. 適時將製作的細節封裝, 如此可在改變時, 減少對外操作的影響 => ripple effect 低, 可維護性高(如程式碼2)
1
2
3
4
5
6
Person                   外界
setHeight(int h) height = -30; (Can't use)
{ setHeight(-30);
if (h < 0) error;
height = n;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
//今日有一客戶需一排序程式
BubbleSort(data) {
... //但由於資料愈來愈多嫌太慢
}
QuickSort(data) {
... //卻發現舊系統中都是 bubble sort, 無法執行 quick sort
}

// 所以當初應
Sort(data) {
BubbleSort(data) // 改成
QuickSort(data)
}
  1. Inheritance 繼承
    • Def:
      • 子類別(Child class) 可以繼承 父類別 (parent class) 的屬性及運作, 亦可加入 child class 自訂的屬性及運作
    • 圖:
    • 優點:
      1. 支援 software reuse (軟體再利用) => 省下重複開發成本
      2. 支援 component base software developments (以元件為基礎的軟體開發方式) => VB , 品質好, 速度快
    • 缺點:
      1. 當繼承深且複雜的時候, 會使 compiler 的 performance 下降, 耗費時間去找尋各 data 的來源
      2. readable 及 maintainable 的程度下降, 因為太多層, 所以視窗太多, 要找時也困難
      3. 有 Naming Conflicting 的議題(命名衝突), 又稱 “ambiguous calling” (模糊呼叫)
      4. 重複繼承的問題

補充 Encapsulation 存取權限:

Note:

  1. 在 c++中額外提供 “friendly” 權限, 當 class A, B 2者設為 friend, 即可取用之
  2. 在 java 中若沒宣稱權限, 則為 default 權限, 此時只有 class 本身及同 package(類似目錄的概念) 下方可使用
  1. Polymorphism 多型
    • Def: O.O 程式於 “執行期間” (Runtime 才決定呼叫的 function 之所在 -> Dynamic Binding), 不同型別之物件, 接收到同一訊息 (同名), 會有不同的行為 (異式), 反應謂之「多型」
    • Note: binding
    • Ex: