[心得整理] c# 物件導向程式 - 2.封裝、繼承、多型的三大特性

[心得整理] c# 物件導向程式 - 2.封裝、繼承、多型的三大特性 

前言

這三大特性封裝、繼承、多型 已經有許多人寫過,不過我還是想寫一些我的心得分享,
其中也包含Bill叔C#物件導向的上課心得

封裝

拿現實世界來舉例的話 
自動販賣機 來說好了 ,有投錢的裝置,選擇商品的按鈕,拿取商品的箱子
買可樂的步驟 投錢,選可樂,拿可樂
你不用知道為何投錢後按鈕燈會亮,按按鈕後可樂如何掉下來
這些知識都被封裝起來

程式的世界來舉例

//範例一
var flag = string.IsNullOrWhiteSpace(temp);

//範例二
byte[] data = new byte[DATA_SIZE];
byte[] result; 
SHA1 sha = new SHA1CryptoServiceProvider(); 
result = sha.ComputeHash(data);

不用知道string 是如何去判斷,是不是null跟空白,
只需要知道把字串傳入就會回傳bool  (有興趣知道嗎 原始碼連結)

不用知道sha1的雜湊的知識,你只要呼叫ComputeHash傳入參數
就會得到sha1的雜湊值

封裝我是這樣想
就是把邏輯或知識給取個形容詞也就是方法名稱,定義傳入與傳出
然後把將同性質的邏輯(方法),集合在一起,建立一個class (物件藍圖)
這樣就是呼叫方法,得到結果(投錢,得到可樂)

繼承

現實世界舉例就是物種

 

看到上圖就知道 被繼承的物種一定會有上一層的特徵與行為
章魚一定就是8腕,魷魚就是8腕+兩觸手

程式來說舉例

public class myList<T> : List<T>
{

}
static void Main(string[] args)
{
    myList<int> tempList= new myList<int>();
    tempList.Add(1);
}

我去繼承list<T>我就有add這方法可以呼叫,
注意我故意在myList<T>沒有寫任何一行code
因為我繼承list<T>所有屬性與方法 (特徵與行為)

繼承我是這樣想的
繼承class,是想重用(Reuse)
繼承介面,為了有彈性

多型

多型跟繼承有很大的關係
現實世界的多型可以用 老鷹企鵝來比喻 (連結是連到維基百科)
老鷹與企鵝都是繼承鳥綱但是兩者最快速移動方式
老鷹是飛翔,企鵝是游泳
他們都繼承鳥類所有繼承特徵與行為,
但移動的行為老鷹是在天上飛最快,企鵝在海裡遊最快
同樣都是移動,但行為不同,結果一樣,這就是多型

程式來說明就是91重構文章的算運費
算運費是每一家貨運公司都會有的,但是每一家計價方式都不同
同樣都是算運費,但計價邏輯不同,結果得到價錢,這就是多型
寫法的話
抽象類別 - 當抽象類別的方法有用virtual 這樣繼承的class就可以override
                  程式碼請看  MSDN 多型 (C# 程式設計手冊)
介面        - 當繼承介面的類別就要實做方法簽章
                  程式碼請看 MSDN介面 (C# 程式設計手冊)

多型我是這樣想
就是抽象化,可以被抽象化的東西,通常可以有多樣表現

結語

物件導向三大特性,理解後就能寫出好程式嗎??是還不夠的
需要學習SOLID原則,才能寫出好的物件導向程式

延伸閱讀

物件導向:封裝、繼承、多型

[預告]: 物件導向初學者應該要知道的事情

要如何找出物件呢? 物件導向初學者應該要知道的事情(一)

為什麼我找出來的物件都是UI物件? 物件導向初學者應該要知道的事情(二)

到底誰該去繼承誰? 物件導向初學者應該要知道的事情(三)

繼承是父子關係?才怪! 物件導向初學者應該要知道的事情(四)

課程推薦 

skilltree - 物件導向實作課程(使用C#)

如果內容有誤請多鞭策謝謝