Fork me on GitHub

12/20/2009

[C# 筆記] Inheritance 繼承

  • code reuse 有兩個面向: 一種是 is-a ( classical inheritance) 關係、一種是 has-a (containment/delegation) 關係。
  • 所謂 has-a 關係允許一個類別定義一個其他類別的成員變數,並且把該成員變數的 functionality 間接的 expose 給該類別使用者。這也達到封裝 (data hiding) 的目的,因為如此一來該物件使用者並不知道該類別中還包含了另一個類別成員變數。
  • 子類別若定義新的成員,該成員並不能存取父類別的 private member。
  • C# 當中沒有多重繼承,一個類別只能繼承自單一父類別。但是 interface 則可以 derive frome multiple interfaces。
  • sealed Keyword
    • 使該 class 無法被繼承
    • C# structures 隱含預設為 sealed 即無法被繼承
  • base Keyword
    • 子類別建構子當中的參數,如果是要拿來初始化父類別的欄位資料的話,需要使用 "base" 來增加初始化的效率。
    • public Manager(string fullName, int age, int empID, float currPay, string ssn, int numbOfOpts) : base(fullName, age, empID, currPay, ssn) 例如:前五個參數主要拿來初始化繼承而來的 field data,因此用 "base" 明確指定對應到哪個欄位
    • 使用 "protected" 的好處是: 子類別要存取父類別當中的 protected 成員不再需要透過 public 的 properties,而可以直接存取。當然這會造成一些封裝的危險,即可以透過子類別改變父類別的 internal data。Although protected field data can break encapsulation,it is quite safe (and useful) to define protected methods.When building class hierarchies,it is very common to define a set of methods that are only for use by derived types
    • protected 成員在非家族類別的眼中即為 private。
    • 在繼承分支到最後,一些子類別在分支下去也許沒有太大的意義,這時候可以利用 "sealed" Keyword 避免該類別再一步被 extend,也就是無法被繼承。
    • 要描述 has-a 的關係很簡單,只要在一個類別 A 當中宣告另一個類別的物件 B,即能表達 A contains B 的概念。所謂 Delegation 指的則是在 A 中創建一個方法,讓使用者可以透過者個透露在外頭的 A 的方法,而完成 B 所能達到的功能性。
    • Nested Type (巢狀型別)
      • 巢狀型別允許對於 inner type 得到完全的 accessru,即使被宣告成 private。
      • 因為 inner type 屬於 outer class 的一個成員,因此他可以存取 outer class 的 private 成員。
      • inner type 經常扮演 outer class 的 helper,而並非為外部所用。

    No comments:

    Post a Comment