談談C#中的三個關鍵詞new , virtual , override

 C#支持單繼承,說到繼承就不得不說new,virtual和override這三個關鍵詞,靈活正確的使用這三個關鍵詞,可使程序結構更加清晰,代碼重用性更高。
如下是msdn中對newvirtualoverride的定義:
        使用 new 修飾符顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請使用相同名稱在派生類中聲明該成員,並用 new 修飾符修飾它。
        virtual 關鍵字用於修改方法或屬性的聲明,在這種狀況下,方法或屬性被稱做虛擬成員。虛擬成員的實現可由派生類中的重寫成員更改。
調用虛方法時,將爲重寫成員檢查該對象的運行時類型。將調用大部分派生類中的該重寫成員,若是沒有派生類重寫該成員,則它多是原始成員。默認狀況下,方法是非虛擬的。不能重寫非虛方法。
不能將 virtual 修飾符與如下修飾符一塊兒使用:
static    abstract    override
        使用 override 修飾符來修改方法、屬性、索引器或事件。重寫方法提供從基類繼承的成員的新實現。由重寫聲明重寫的方法稱爲重寫基方法。重寫基方法必須與重寫方法具備相同的簽名。
不能重寫非虛方法或靜態方法。重寫基方法必須是虛擬的、抽象的或重寫的。
重寫聲明不能更改虛方法的可訪問性。重寫方法和虛方法必須具備相同的訪問級修飾符。
不能使用下列修飾符修改重寫方法:
new   static    virtual   abstract
重寫屬性聲明必須指定與繼承屬性徹底相同的訪問修飾符、類型和名稱,而且重寫屬性必須是虛擬的、抽象的或重寫的。 
能夠稍微概括一下:
一、對於基類中說明爲虛的方法則必須在派生類中new或者override( :對於基類的虛方法,雖然你在派生類中即不new也不override,但系統仍是會提示你添關鍵字。不然系統將視其爲隱藏。咱們的意思是同樣的,但總以爲明明確確寫上關鍵字仍是好些)。 二、若是用基類指針指向派生類對象的方式,動態匹配的源動力是virtual,而new和override都會阻止這種向下尋求匹配的行爲,因此要使虛函數的性質得已保持下去,就要隱藏基類的虛方法,即在派生類中隱藏基類虛方法時,同時加以virtual關鍵字,使在多層次繼承中可以調用到對象自身的版本。 三、在多層次繼承中,三個關鍵字使用次序有限定,new沒有使用前提,即無論是普通方法、虛方法仍是重寫了的方法。virtual的使用,在它的基類不能有函數簽名相同的方法,不然系統將提示添加new,即隱藏基類中的方法。virtual通常只出現一次,除非要在子類中隱藏父類的虛方法。override的使用是爲了重寫基類虛方法。
相關文章
相關標籤/搜索