本文為延續如何學好程式語言一文,要來說明學習物件導向程式設計需要的學習目標有哪些:
- 物件(Objects)
- 類別(Classes)
- 繼承(Inheritance)
- 多型(Polymorphism)
- 封裝(Encapsulation)
物件(Objects)
所有的東西都是物件。(Everything is an object.)這句話是什麼意思呢?舉凡看的到、摸的到、看不到、摸不到、聞的到的東西等,只要說得出名稱的都可以稱為物件,所以「看到鬼了!」這句話中的「鬼」是個無形的物件(嗎?)。鉛筆、原子筆等就是有形的物件。在程式碼中的變數名稱就是程式語言中的物件,例如下面程式碼:
int grade;grade 可能是用來表示「成績」這個物件。
String studentName;
studentName可能是用來表示「學生姓名」這個物件。
在程式碼中物件的宣告(定義)方式如下,
Object objName;Object是物件的型態,有可能為基本型別:int, float, char, ...etc,或是類別(Class)型別。談到類別的話,就請往類別一小節閱讀。
每個物件都有行為與特徵,例如人這個物件會跑、說、走、跳等行為,人有身高、體重、膚色等特徵,行為在程式語言裡常用成員函式(Member functions)來實現,而特徵常用類別的成員資料(Member data)來表示。
類別(Classes)
因為程式語言內建的基本型別只能記錄少許的資訊,例如int型別就只能記錄整數部分,於是在C語言中有strcut的出現,可用來記錄不同型別的資訊例如:struct Computer{ int product_id; char *cpuType; int*ram; float price; };上述例子Computer紀錄了四筆資料,但這樣還不能描述物件的行為。於是電腦科學的專家們想出classes這個觀念出來,用類別來表示物件的藍圖(積木),於是【將現實生活中的物件變成程式語言中的軟體物件】這一過程叫做資料抽象化。物件與類別的圖文說明可參考此文:Objects and Classes in Java。
繼承(Inheritance)
繼承這觀念和生物界的繁殖有些關係,因為生物會繼承上一代的特徵,但程式碼本身不會主動繁殖,導致繼承的觀念出現在OOP的世界裡,不同的程式語言有不一樣的繼承語法,例如Java, php是用extends,C++與C#是用英文冒號 : 。繼承的主要目的是重複使用程式碼與擴充程式功能。多型(Polymorphism)
有了繼承之後,若遇到下列情況時,該怎麼辦?
在程式中用Pen當作基礎類別建立了五種筆:鉛筆、鋼筆、毛筆、水彩筆、墨水筆。
每一種筆都有畫線這個動作,藉由多型就可以做類似下面的程式碼:
myPens[0].drawLine(); 會呼叫 Pencil的畫線動作。
myPens[2].drawLine(); 會呼叫 Brush的畫線動作。
以上是簡易說明多型的用法,詳細的圖文說明可參考此文:Java Inheritance & Polymorphism。
在程式中用Pen當作基礎類別建立了五種筆:鉛筆、鋼筆、毛筆、水彩筆、墨水筆。
每一種筆都有畫線這個動作,藉由多型就可以做類似下面的程式碼:
Pen[] myPens = { new Pencil(), new FountainPen(), new Brush(), new WatercolorPen(), new InkPen() }; myPen[index].drawLine();此例中,myPens[index]會根據陣列索引的不同而去呼叫對應的畫線動作,例如:
myPens[0].drawLine(); 會呼叫 Pencil的畫線動作。
myPens[2].drawLine(); 會呼叫 Brush的畫線動作。
以上是簡易說明多型的用法,詳細的圖文說明可參考此文:Java Inheritance & Polymorphism。
封裝(Encapsulation)
資料抽象化是要弄清楚一個類別需要有什麼功能,而封裝是要知道如何達到類別所需要的功能,也就是說在抽象化的時候,可能會設計出下面的類別:
public class Student{ String name; int age; String nickName; void run() { } void hungry() { } void sleeping() { } }但在封裝的過程裡,就會將權限修飾子(Access Modifiers)與函式內的程式碼給補齊,Student類別有可能變成:
public class Student{
private String name;
protected int age;
protected String nickName;
public void run() { System.out.println("run"); }
public void hungry() { System.out.println("hungry"); }
protected void sleeping() { System.out.println("sleeping"); }
}
沒有留言:
張貼留言