顯示具有 物件導向系列文 標籤的文章。 顯示所有文章
顯示具有 物件導向系列文 標籤的文章。 顯示所有文章

2015年12月25日 星期五

[C#] 變異性

變異性

  • 共變性
    • 用基底類別取代衍生類別
    • 常用在輸出用
    • 多用再回傳
  • 不變性
    • 如 泛型類別具不變性
  • 逆變性
    • 用衍生類別取代基底類別
    • 多用在傳進參數
Tips
  1. 先寫共變性
  2. 再去分辨
泛型介面變異性

        宣告Out
            共變性
                IEnumerable<T>
        宣告In
            逆變性
                IComparer<T>

[C#] 泛型

筆記整理

  • .Net2.0 開始
  • 強型別概念
  • 應用 : 介面、類型、方法、委派
  • 泛型會實做非泛型
  • 避免容器操作Boxingm Unboxing

default 關鍵字

  • 當沒有條件約束時 : return default(T)
  • 當有條件約束時 : 
    • 實質型別 : 0
    • 參考型別  : null
  • 泛型約束條件
    • where T :  Class
    • where T : new()   ----- 必須擁有共用的無參數建構函示

[C#] 介面 Interface

介紹

  • 抽象中的抽象
  • 職責範圍小設計必須要小(設計必須要小)

筆記整理

  • 關鍵字使用interface
  • 界面是屬性、方法、事件、索引的簽章
  • 不能定義執行個體欄位與建構式
  • 不允許定義靜態成員
  • 繼承同名簽章的多介面需要”明確實做”!
    • 明確實做需要轉型才能呼叫

[C#] 擴充方法

筆記整理

  • Class 前需要加 Static
  • 所有Method 前也需要加 Static
  • 編譯後就是static method
  • 不能與原類別方法同名
  • 講求內聚性的方法一定要用成員方法

好處

  • 提高閱讀性
  • 現在常大量使用linq (ex. abc.where(…)),如果沿用靜態方法就會變成大腸包小腸

使用情境

  • 遇到 seal class
  • 類別不該用繼承做的時候-造成低內聚、高耦合

2015年12月6日 星期日

[C#] 靜態類別

靜態類別

  • 一定是密封,無法被繼承
  • 無法產生實體
  • 只包含靜態成員
  • 無法控制靜態建構涵式執行時間

使用時機

  • 從設計的角度思考
    • 內聚性高的一定是執行個體成員
    • 內聚性低的靜態成員佳 (ex.util)

[C#] 類別&類別成員

存取修飾詞

  • public : 公開
  • private : 私人
  • protected : 繼承者可以存取
  • internal : 組件內可存取
  • internal protected : 兩者取其一

其他修飾詞

  • abstract
    • 只有簽章
    • 一定要override –> 強迫實作
    • 使用情境:職責很抽象無法預定(ex."打"架、”打”屁、”打”牌)
  • virtual : 可以覆寫
  • sealed
    • 不可被繼承
    • 常配override使用
  • new
    • 少用,最好不用!!!
    • 上層沒有修飾詞,要蓋過去時才用
    • 重要 :  使用new的method會靠type的型別來執行該method(慎用)
  • override : 追回最上層一定是abstract、virtual,override本身也可以被覆寫

型別物件vs值型個體物件

常數

  • 編譯時期就會嘗試取代值
  • 使用readonly property取代

欄位(field)

  • 類別層級的變數
  • 很少是public

屬性(property)

  • 一種方法的變形
  • 自動實作屬性 ({get;set;})
  • 編譯完是沒有屬性的
  • 唯讀/寫 (ex. {get;private set;})

方法(method)

  • 關鍵字 : ref、out、params
    • ref : 遞迴較常用,防止stack爆掉
    • out : 強迫該方法一定要產生該物件
    • params : 語法糖
  • 傳值與傳址 : 分實體與參考型別的傳值、址,主要主詞在變數就對了
  • Tuple
  • object x; 代表 ?? (0000, null)
  • 多載 :
    • 逼不得已才用(東西一多就會變複雜)
    • 如果參數一樣多 : 使用泛型、繼承式多型

委派

  • 基礎 :
    • 參考型別
    • 一種方法簽章的型別
    • 透過Invoke叫用,依序執行所有linkedlist
    • 心中都有一個linkedlist
  • Action型別
  • Func型別
  • Predicate(舊)

事件

  • 觀察者模式簡化版
  • mvc比較少用到

建構式

  • 呼叫自己的建構式很重要
  • 隱含 : 語法糖,你應該要寫但你不寫也沒關係
  • 建構式不會被繼承
  • 繼承鏈順序
    •    繼承關係 : System.Object -> A –> B
    •    GO :  B初始分配位置 -> A初始 -> OBJ初始 -> A建構 -> B建構

[C#] 型別與變數

型別概論 :

  • Primitive Type
  • Value Type
    •     結構
    •     列舉
  • Reference Type
    •     介面
    •     類別
    •     委派

參考型別 vs 實值型別:

  • 記憶體分類的角度 :
    • 實值行別存在stack
    • 參考型別存在Heap
  • 變數觀點 :
    • 實值型別變數就是物件本身
    • 參考型別變數則是儲存指向物件的參考(位址)

var 宣告:

  • 強型別
  • 只能做為區域變數使用

衍伸觀念:

  • 參考型別執行個體與變數的關係
  • 參考型別執行各體(物件)的型別和變數一定要相同?

boxing & unboxing :

  • boxing : value type轉成reference type
  • unboxing : 反之

[C#] 繼承、封裝、多型

記住 : 絕大部分的設計就是在好好運用這三大特性!!!

最重要的 : 多型

 

繼承:

  • 擁有被繼承者的型別特徵
  • 只能繼承一個父類別(祖父以上…不算)
  • 可實作多個介面

封裝:

  • 隱藏不讓外界所知資訊與行為
  • 透過特定的公開介面與外界互動

多型:

  • 繼承式多型 (ex. base(),實作介面)
  • 參數式多型 (泛型)
  • 多載 (相同名稱,不同參數清單)
  • 強制同型(ex.轉型)

[C#] 物件、類別、抽象化

物件 :

  1. 外界真實人事物的抽象定義
  2. 程序和資料的結合

類別 :

  1. 透過分類將一群類似的物件”抽象化”的概念

抽象化:

  1. 分類的基礎技巧
  2. 找出關鍵性的特徵加以描述,ex.球的分類可以是顏色或球的種類等
  3. 例如 : 地圖

[C#] OOP 物件導向學習(簡介)

前言 : …一次學七個語言,不如一個語言學七次,重新複習C#。

章節 :

1. 物件、類別、抽象化

2. OOP三大特性

3.型別與變數

4.類別&類別成員

5.靜態類別

 

OOP by C#