狀況1:轉成BaseClass時的差異

  • 使用obj2.MethodA時,是呼叫classB的MethodA
  • 使用classBase存取物件時,用new的classB是呼叫classBase的MethodA!

狀況2:三層繼承時

  • 編譯時,classC.MethodA會發生錯誤:「標記為 override 的成員 'ConsoleApplication1.test1.classC.MethodA()' 不能標記為 new 或 virtual」

狀況3:介面(interface)

狀況4:自訂屬性(Custom Attributes)

狀況5:泛型(Generic)


  • abstract [msdn]
    • 抽象類別
      • 抽象類別不能執行個體化。
      • 抽象類別可能會包含抽象方法和存取子。
      • 抽象類別不可能使用 sealed修飾詞來進行修改,這表示此類別不能繼承。
      • 衍生自抽象類別的非抽象類別必須包含所有繼承的抽象方法和存取子之實作。
    • 抽象方法、抽象屬性
      • 抽象方法宣告只允許在抽象類別裡。
      • 因為抽象方法宣告沒有提供實際的實作,因此並沒有方法主體,方法宣告僅以分號做為結束而且簽章 (Signature) 之後沒有大括號 ({ })。例如:
        public abstract void MyMethod();
      • 抽象方法宣告中使用 static 或 virtual 修飾詞是錯誤的。
    • 在靜態屬性上使用 abstract 修飾詞是錯誤的。
    • 可在衍生類別中覆寫抽象繼承屬性,方式是包含使用 override 修飾詞的屬性宣告。
  • virtual [msdn]
    • 不能與 static、abstract, private 或 override 等修飾詞一起使用
    • 在靜態屬性上使用 virtual 修飾詞是錯誤的
  • override [msdn]
    • 提供繼承自基底類別的成員新實作
    • 被覆寫的基底方法必須是 virtual、abstract 或 override
    • 不能變更 virtual 方法的存取範圍。override 方法和 virtual 方法都必須有相同的存取層級修飾詞。
    • 不能使用 new、static、virtual 或 abstract 等修飾詞修改 override 方法
  • new [msdn]
    • 當 new 關鍵字做為修飾詞時,會明確隱藏繼承自基底類別的成員。
    • 同時使用 new 和 override 會發生錯誤,因為這兩個修飾詞在意義上是互斥的。override 為繼承的成員擴充實作 (Implementation) 時,使用 new 可建立具有相同名稱的新成員,並將原來的成員隱藏起來。

參考資料: