如何學好物件導向程式設計

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

本文為延續如何學好程式語言一文,要來說明學習物件導向程式設計需要的學習目標有哪些:
  • 物件(Objects)
  • 類別(Classes)
  • 繼承(Inheritance)
  • 多型(Polymorphism)
  • 封裝(Encapsulation)


物件(Objects)

所有的東西都是物件。(Everything is an object.)
這句話是什麼意思呢?舉凡看的到、摸的到、看不到、摸不到、聞的到的東西等,只要說得出名稱的都可以稱為物件,所以「看到鬼了!」這句話中的「鬼」是個無形的物件(嗎?)。鉛筆、原子筆等就是有形的物件。在程式碼中的變數名稱就是程式語言中的物件,例如下面程式碼:
int grade;
String studentName;
grade 可能是用來表示「成績」這個物件。
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當作基礎類別建立了五種筆:鉛筆、鋼筆、毛筆、水彩筆、墨水筆。
每一種筆都有畫線這個動作,藉由多型就可以做類似下面的程式碼:
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"); }
}

結語

以上五點是入門物件導向程式設計的基礎觀念,若熟悉之後,可進一步研究Software Design Pattern,雖然Software Design Pattern不限定一定要用OOP來實現,但用OOP來寫Design Pattern比較容易些。此外,學習物件導向程式設計時,可以同時學習物件導向系統設計來相輔相成。

沒有留言: