1. sealed——“斷子絕孫”
密封類不能被繼承。密封方法可以重寫基類中的方法,但其本身不能在任何衍生類別中進一步重寫。當應用於方法或屬性時,sealed修飾符必須始終與override一起使用。
即:密封類不會有子類,所以是“斷子絕孫”。
2. new——“你是我的,我是我的”
new關鍵字用於顯式隱藏從基類繼承的成員。也就是在使用衍生類別時調用的方式方法是new關鍵字新定義出來的方法,而不是基類的方法。
在不使用new修飾符的情況下隱藏成員是允許的,但會產生警告。使用new顯式隱藏成員會取消此警告,並使用衍生類別新定義的方法。
即:好比是不用祖宗的東西,而是用自己創造(new)的東西。
3. virtual——“為了子孫後代”
virtual關鍵字用於修改方法或屬性的聲明,在這種情況下,方法或屬性被稱做虛成員。虛成員的實現可由衍生類別中的重寫成員更改。
調用虛方法時,將為重寫成員檢查該對象的運行時類型。將調用大部指派生類中的該重寫成員,如果沒有衍生類別重寫該成員,則它可能是原始成員。
在預設情況下,方式是非虛擬。非虛方法不能重寫。
不能將virtual修飾符與一下修飾符一起使用:static、abstract和override。
除了聲明和調用文法不同外,虛擬屬性的行為與抽象方法一樣。
在靜態屬性上使用virtual修飾符是錯誤的。
通過override修飾符的屬性聲明,在衍生類別中重寫虛擬繼承屬性。
即:virtual是為了讓子孫後代可以實現各自的夢想而做的。
4. abstract——“我是上帝”
abstract修飾符可以和類、方法、屬性、索引器及事件一起使用。
在類聲明中使用abstract修飾符,以指示該類只能是其他類的基類。標記為抽象或包含在抽象類別中的成員必須通過從抽象類別派生的類來實現。
抽象類別具有以下特性:
抽象類別不能執行個體化。
抽象類別可以包含抽象方法和抽象訪問器。
不能用sealed修飾符修改抽象類別,這意味著該類不能被繼承。
從抽象類別派生的非抽象類別必須包括繼承的所有抽象方法和抽象訪問器的實現。
在方法或屬性聲明中使用abstract修飾符以指示此方法或屬性不包含實現。
抽象方法具有以下特性:
抽象方法是隱式的virtual方法。
只允許在抽象類別使用抽象方法聲明。
抽象方法聲明不提供實際的實現,所以沒有方法體;方法聲明只是以一個分號結束,並且在結束後沒有花括弧。
實現由override方法提供,它是非抽象類別的成員。
在抽象方法聲明中使用static或virtual修飾符是錯誤的。
除了在聲明和調用文法上不同外,抽象屬性的行為與抽象方法一樣。
在靜態屬性上使用abstract修飾符是錯誤的。
在衍生類別中,通過包括使用override修飾符的屬性聲明可以重寫抽象的基礎屬性。
即:abstract是一種抽象,好比上帝,是人們對神的抽象,看似什麼都能幹,其實什麼都幹不了。
5. override——“一手遮天”
使用override修飾符來修改方法、屬性、索引器或事件。主要是提供衍生類別對基類方法的新實現。覆蓋上面abstract、virtual兩種關鍵字修飾的成員。
由重寫聲明重寫的方法稱為重寫基方法。重寫基方法必須與重寫方法具有相同的簽名。
重寫基方法必須是虛擬、抽象或重寫的。不能重寫非虛方法或靜態方法。
不能使用下列修飾符修改重寫方法:new、static、virtual和abstract。
重寫屬性聲明必須指定與繼承屬性完全相同的存取修飾詞、類型和名稱,並且重寫屬性必須是虛擬、抽象的或重寫的。
即:override好比不但不用祖宗的那套,而且還自己創一套新功夫代替祖宗那套。
new和override的區別如下:
用override的基類方法必須要用virtual,而new不必要。
用一個基類的對象調用基類的virtual方法時,override重寫的衍生類別的方法會被訪問,而new重寫的衍生類別中的方法不會被訪問。