Home [C# 筆記] 什麼是面向對象(物件導向)
Post
Cancel

[C# 筆記] 什麼是面向對象(物件導向)

什麼是面向對象(物件導向)

  • 原則:使用對象來描述世界中客觀存在的一切事物
  • 世界的運行過程,就是不同對象互相作用的結果
  • 物件導向要求我們用程式碼來模擬真實世界的客觀運行規律
  • 對象(物件)、類、實例(實體)
  • 從宏觀上來認識,分解並且總結某個事物的運行規則

舉例:五子棋

七個步驟,接下來循環234567,直到黑子勝出 或是白子勝出,然後遊戲結束。

以下的每一個步驟都可以看作獨立的函數,或者獨立的方法來進行開發。

這樣自下而下的過程,就是典型的物件導向的編程思想。

1
2
3
4
5
6
7
8
9
第一步,開始遊戲
While
    第二步,黑方出子
    第三步,繪製棋盤
    Until 第四步,判斷黑子有沒有勝
    第五步,白方出子
    第六步,繪製棋盤
    Until 第七步,判斷白子有沒有勝
遊戲結束

如果把五子棋遊戲從面向過程改為面向對象的設計思路,我們可以把整個程式碼抽象為四個模塊系統:1.遊戲流程 2.黑白雙方 3.棋盤繪制 4.規則判定。

  • 遊戲流程:負責遊戲流程控制
  • 棋盤繪制:繪制渲染遊戲畫面
  • 黑白雙方:負責出子或是悔棋
  • 規則判定:負責制定遊戲規則、判斷輸贏

根據這四個系統,於是我們就得到了遊戲的五個對象(物件):

  1. 遊戲控制器
  2. 棋盤
  3. 黑玩家
  4. 白玩家
  5. 規則系統

在面向對象的思路中,我們並不需要定義程式碼的過程,只需要定義不同的對象(物件),或者說,不同的系統之間是如何互相影響、互相作用就可以了。

於是我們的程式碼就變成這樣了:
首先初始化遊戲的四個系統

  • 初始化:1.遊戲控制器 2.棋盤 3.黑玩家 4.白玩家 5.規則系統
  • 向「遊戲控制器」添加:棋盤、黑白玩家、規則系統
  • 然後使用「遊戲控制器」開始遊戲
  • 遊戲自動運行

「遊戲控制器」會自動運行整個遊戲流程,還會輸出結果。所以整個遊戲都將會被「遊戲控制器」所控制。

這個時候,我們不知道,也不需要知道這個遊戲是如何運行的,但是,我們知道的是,棋盤、黑白雙方、判定系統都會在一定程度內相互作用,並且通過「遊戲控制器」連接成為一個統一的整體。

所以當我們從宏觀上來認識,分解並且總結某個事物的運行規則,這就是面向對象(物件導向)。

對象(物件)

那麼,面向的對象到底是什麼呢?任何一個客觀存在的事物都是對象(物件),類是對象、實例是對象、變量也是對象,甚至數據類型也可以視為是對象。

  • C#中,一切皆是對象(物件)
  • 類是對象、實例是對象、變量也是對象,甚至數據類型也是對象

舉例:一輛車

  • 能夠執行行駛相關的動作,可以「開」、「停」、「剎車」。 能被執行的動作,是對象的「調用方法」。
  • 不能執行,但可以被量化、可以被描述的信息,比如:重量、排量、軸距、油耗…等。 而可以被量化的描述,則是對象的「基本屬性」。

對象的特徵

「方法」和「屬性」是對象最基本的兩個特徵

  • 能被執行的動作,是對象的調用「方法」。
  • 而可以被量化的描述,則是對象的基本「屬性」。

類別 Class

那麼,類別 Class 是什麼呢?

  • 類與面向對象息息相關
  • 指的就是「一類東西」

比如:「車」是一類東西;
細分為:汽車、卡車、火車、自行車;
「汽車」繼續細分:寶馬、BMW、Benz

所以,類class 就是

所以類的意思,就是表示一類事物的總和,相當於是在描述這一類事物的藍圖,

  • 一類事物的「總和」
  • 相當於描述這一類事物的「藍圖」

舉例:五菱宏光

1
2
3
4
5
6
7
class 五菱宏光 {
    外號:秋名山神車 --屬性
    馬力:5w匹  --屬性
    拉貨()  --方法
    載人()  --方法
    玩漂移() --方法
}

這個汽車使用class 來聲明它是個類,類的名稱:五菱宏光,這個class是由兩個部分組成的:屬性、方法。外號和馬力是可以被量化的描述,屬於類的基本屬性,而拉貨、載人、玩漂移則是可以被執行的動作,屬於類的調用方法。

而以上這個「五菱宏光」類,則是我們通過觀察真實世界中「五菱宏光」這個汽車而總結出的定義。

實例(實體)instance

何為實例(實體)instance?

我們說類可以描述一類事物,但是當我要表示這類事物中某一個具體的個體,應該怎麼處理呢?這時候我們就需要使用實例 instance。

  • 類表示一類事物
  • 「實體」表示這類事物中的某一個具體的個體

比如說,我有一個輛五菱宏光,老司機是我
偽程式碼:

1
2
3
五菱宏光 Riva的神車 = new 五菱宏光();

使用new初始化「五菱宏光」的物件,而這個物件的名稱就叫作「Riva的神車」

也可以簡單的理解為「初始化」

一般來說,我們會使用new這個關鍵字來實例化對象(實體化物件),簡單解釋一下,我們使用了new這個關鍵字,初始化了一個「五菱宏光」的對象,而這個對象的名稱就叫作「Riva的神車」。

類、對象、實例(類、物件、實體)

套《Thinking in Java》一句話說明類、對象,以及實例的三者關係:「每個「物件」都是某個「類別(class)」的一個實體」

  • 每個「對象(物件)」都是某個「類(class)」的一個實例(實體)。
  • 對象(物件)與實例(實體)可以劃上約等號,對象(物件)≈實例(實體)
  • 創建一個物件的過程就叫作「實例化(實體化)」,而實例化(實體化)的產物就叫作「實例(實體)」、或者叫做「對象(物件)」

面向對象(物件導向)的意義

1
2
3
4
5
6
7
class 五菱宏光 {
    外號:秋名山神車
    馬力:5w匹
    拉貨()
    載人()
    玩漂移()
}
  • 通過觀察真實的五菱宏光總結得出的定義
  • 不一定能完全符合客觀規律
  • 客觀事實某個片段在程式碼中的投影

王者的定義

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class 五菱宏光 {
    車長:4420
    車寬:1685
    車高:1770
    軸距:2720
    排量:1.2/1.5
    檔位:MT
    馬力:76~99
    拉貨()
    載人()
    遙控鑰匙啟動()
    駐車電達警報()
    一鍵升窗()
    電動調節後視窗()
    ... ...
}

https://www.bilibili.com/video/BV1Ss4y1B7zE?p=17

This post is licensed under CC BY 4.0 by the author.