new 修飾符、虛方法、重寫方法、抽象方法

new 修飾符

class-member-declaration 中可以使用與一個被繼承的成員相同的名稱或簽名來聲明一個成員。發生這種情況時,就稱該派生類成員隱藏 (hide) 了基類成員。隱藏一個繼承的成員不算是錯誤,但這確實會導致編譯器發出警告。若要取消此警告,派生類成員的聲明中可以包含一個 new 修飾符,表示派生成員是有意隱藏基成員的。如果在不隱藏所繼承成員的聲明中包含 new 修飾符,將對此狀況發出警告。通過移除 new 修飾符可取消顯示此警告。
 =======================================

虛方法

若一個實例方法的聲明中含有 virtual 修飾符,則稱該方法爲虛方法。若其中沒有 virtual 修飾符,則稱該方法爲非虛方法。非虛方法的實現是一成不變的:無論該方法是在聲明它的類的實例上調用還是在派生類的實例上調用,實現均相同。與此相反,虛方法的實現可以由派生類取代。取代所繼承的虛方法的實現的過程稱爲重寫 (overriding) 該方法. 在虛方法調用中,該調用所涉及的那個實例的運行時類型 (run-time type) 確定了要被調用的究竟是該方法的哪一個實現。在非虛方法調用中,相關的實例的編譯時類型 (compile-time type) 是決定性因素。準確地說,當在具有編譯時類型 C 和運行時類型 R 的實例(其中 R 爲 C 或者從 C 派生的類)上用實參列表 A 調用名爲 N 的方法時,調用按下述規則處理:
• 首先,將重載決策應用於 C、N 和 A,以從在 C 中聲明的和由 C 繼承的方法集中選擇一個特定的方法 M。
• 然後,如果 M 爲非虛方法,則調用 M。
• 否則(M 爲虛方法),就會調用就 R 而言 M 的派生程度最大的那個實現。
對於在一個類中聲明的或者由類繼承的每個虛方法,存在一個就該類而言的方法的派生程度最大的實現 (most derived implementation)。就類 R 而言虛方法 M 的派生度最大的實現按下述規則確定:
• 如果 R 中含有引入的 M 的 virtual 聲明,則這是 M 的派生程度最大的實現。
• 如果 R 含有關於 M 的 override,則這是 M 的派生程度最大的實現。
• 否則,就 R 而言 M 的派生程度最大的實現與就 R 的直接基類而言 M 的派生程度最大的實現相同。
===============================================================

重寫方法

若一個實例方法聲明中含有 override 修飾符,則稱該方法爲重寫方法 (override method)。重寫方法用相同的簽名重寫所繼承的虛方法。虛方法聲明用於引入新方法,而重寫方法聲明則用於使現有的繼承虛方法專用化(通過提供該方法的新實現)。
由 override 聲明所重寫的那個方法稱爲已重寫了的基方法 (overridden base method)。對於在類 C 中聲明的重寫方法 M,已重寫的基方法是通過檢查 C 的各個基類類型來確定的,該檢查過程如下:從 C 的直接基類類型開始檢查,然後依次檢查每個後續的直接基類類型,直到在給定的基類類型中至少找到一個在用類型實參替換後與 M 具有相同簽名的可訪問方法。爲了查找已重寫了的基方法,可訪問方法可以這樣來定義:如果一個方法是 public、是 protected、是 protected internal,或者是 internal 並且與 C 聲明在同一程序中,則認爲它是可訪問的。
除非下列所有項對於一個重寫聲明皆爲真,否則將會出現編譯時錯誤:
• 可以按照上面描述的規則找到一個已重寫了的基方法。
• 只有一個此類重寫的基方法。此限制僅在基類類型是構造類型時(在這種情況下,用類型實參替換會使兩個方法的簽名相同)纔有效。
• 該已重寫了的基方法是一個虛的、抽象或重寫方法。換句話說,已重寫了的基方法不能是靜態或非虛方法。 • 已重寫了的基方法不是密封方法。
• 重寫方法和已重寫了的基方法具有相同的返回類型。
• 重寫聲明和已重寫了的基方法具有相同的聲明可訪問性。換句話說,重寫聲明不能更改所對應的虛方法的可訪問性。但是,如果已重寫的基方法是 protected internal,並且聲明它的程序集不是包含重寫方法的程序集,則重寫方法聲明的可訪問性必須是 protected。
• 重寫聲明不指定 type-parameter-constraints-clauses,而是從重寫的基方法繼承約束。
=======================================================

抽象方法

當實例方法聲明包含 abstract 修飾符時,稱該方法爲抽象方法 (abstract method)。雖然抽象方法同時隱含爲虛方法,但是它不能有 virtual 修飾符。抽象方法聲明引入一個新的虛方法,但不提供該方法的實現。相反,非抽象類的派生類需要重寫該方法以提供它們自己的實現。由於抽象方法不提供任何實際實現,因此抽象方法的 method-body 只由一個分號組成。只允許在抽象類中使用抽象方法聲明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章