歡迎來到類別關係的世界!
你好!今天,我們將探討電腦程式中不同部分是如何「溝通」的。在物件導向程式設計(OOP)中,我們使用類別(Class)作為物件(Object)的藍圖。但就像現實生活一樣,這些藍圖並非孤立存在——它們之間存在著各種關係!理解類別之間如何互動,就是構建結構清晰、功能強大且高效軟體的秘訣。
如果剛開始覺得有點抽象,別擔心。我們會運用許多現實生活中的例子來幫助你理解。讓我們開始吧!
1. 基礎概念:類別與物件
在探討關係之前,我們先快速複習一下基本概念:
• 類別 (Class) 是一個藍圖或模板。(例如:對「車子」的抽象概念)。
• 屬性 (Attribute)(或稱性質)是關於類別的資料。(例如:車子的顏色)。
• 方法 (Method) 是類別可以執行的動作。(例如:啟動引擎 StartEngine)。
• 物件 (Object) 是根據藍圖實際建立出來的東西。(例如:停在車道上的那台紅色豐田汽車)。
• 實例化 (Instantiation) 是從類別建立物件的過程。
快速複習:把類別想像成餅乾模具,而物件就是那塊實際做出來的餅乾!
2. 繼承 (Inheritance) - 「是一種」(Is-A) 關係
繼承是 OOP 中最重要的概念之一。它允許一個類別「繼承」另一個類別的屬性和方法。這能幫助我們避免重複編寫相同的程式碼。
它是如何運作的:
我們有一個基底類別 (Base Class)(也稱為父類別 Superclass 或 Parent),以及一個衍生類別 (Derived Class)(也稱為子類別 Subclass 或 Child)。子類別會擁有父類別的一切,同時還可以擁有自己獨有的功能。
現實類比:
想像一個交通工具 (Vehicle) 類別,它有像是 fuelLevel(燃料水平)的屬性,以及像是 move()(移動)的方法。
汽車 (Car) 是一種交通工具。因此,汽車類別繼承了交通工具類別。
汽車「是一種」交通工具。它會自動知道如何 move(),因為它的「父類別」具備這個能力!
覆寫 (Overriding)
有時候,子類別想要執行的動作與父類別略有不同。這就稱為覆寫 (Overriding)。
範例:一個鳥類 (Bird) 類別可能會有一個描述行走動作的 move() 方法。老鷹 (Eagle) 類別繼承自鳥類,但它會覆寫 move() 方法,將動作描述改為飛行。
記憶小撇步:就像你可能會繼承父母的眼睛顏色,但「覆寫」了他們的嗜好(他們喜歡高爾夫,而你喜歡玩電玩!),類別會繼承特徵,但也可以修改特定的行為。
重點總結:當你可以說「類別 B 是一種 類別 A」時,就使用繼承。這能節省時間並讓你的程式碼整潔美觀。
3. 關聯 (Association) - 「擁有一個」(Has-A) 關係
並非所有關係都是「父子」關係。有時候,兩個類別僅僅是需要互相合作,這稱為關聯 (Association)。
現實類比:
想像一個老師 (Teacher) 類別和一個學生 (Student) 類別。
老師不是學生,學生也不是老師(所以沒有繼承關係)。然而,他們彼此關聯。老師「擁有」一份學生名單。
常見誤區:別把「是一種」(Is-a) 和「擁有一個」(Has-a) 搞混了。
• 汽車 是一種 交通工具(繼承)。
• 汽車 擁有一個 引擎(關聯)。
你知道嗎?關聯非常靈活。它可以是「一對一」(一個人擁有一本護照),也可以是「一對多」(一個團隊擁有許多隊員)。
重點總結:關聯描述了兩個獨立類別之間的連結,且兩者會互相影響。
4. 封裝 (Encapsulation):確保資料安全
隨著類別開始建立關係,我們需要確保它們不會干擾彼此的「私有」資料。這就是封裝 (Encapsulation) 發揮作用的時候。
封裝是隱藏物件內部狀態(資料)的作法,僅允許其他類別透過特定的方法與其互動。我們通常稱這為「資料隱藏」。
現實類比:
想像一個銀行帳戶。你不會讓任何人隨意伸手進金庫修改你的餘額。相反地,餘額是被封裝(隱藏)起來的。人們必須使用像是 deposit()(存款)或 withdraw()(提款)的方法來進行修改,而銀行則會控制這些方法的規則!
鼓勵一下:如果覺得這很難理解,只要記住:封裝就像是在你的資料外層加上一個防護泡泡!
重點總結:封裝透過將屬性設為私有,並使用方法控制存取或修改方式,來確保資料安全。
5. 總結清單
在繼續學習之前,請確保你能回答這三個問題:
1. 我能解釋類別與物件之間的區別嗎?
2. 我知道何時該使用繼承(「是一種」)而非關聯(「擁有一個」)嗎?
3. 我能解釋為什麼封裝對於保護資料很有用嗎?
最終小提醒:當你在考試中遇到關於類別關係的題目時,請務必問自己:「這東西是另一種事物的類別嗎?還是它只是使用了另一種事物?」這將帶領你找到正確答案!