正確使用 new 修飾符

2022-03-05 06:13:14 字數 1252 閱讀 7135

幾乎 .net 所有開發人員都知道 new 修飾符可以重新定義從基類中繼承的非虛成員,但是大部分開發人員並不知道怎麼才能正確使用,甚至出現了濫用的情況。

零、糾正常犯錯誤

講解如何正確使用 new 修飾符前我們先來看乙個段**。

public

class

demobase

}public

class

demo

:demobase

}// more code ...

object o =

makeobject()

;demobase db = o as demobase;

db.method()

;demo d = o as demo;

d.method()

;// more code ...

上面的**中 demo 繼承自 demobase ,好多開發人員看到這段**就會認為兩次呼叫 method 方法的結果應該是相同的,但是實際執行後發現輸出的結果是不同的。這是因為 method 方法的輸出結果取決於開發人員是利用 demobase 型別的引用來指代 demo 物件,還是利用 demo 型別來指代 demo 物件。這裡邊雖然使用了 new 修飾符,但是它不會把非虛方法轉化為虛方法,只會在類中增加乙個方法。之所以會增加乙個方法,是因為非虛方法是靜態繫結的,只要是使用 demobase.method 的地方都執行的是 demobase 裡的 method 方法,即使派生類裡存在同名的方法也會忽略。

tip:這裡再提一句虛方法,虛方法是動態繫結的,只有到執行時才會根據物件的實際型別來確定應該呼叫哪個。

一、正確使用

講到這裡就引出了乙個編碼規則,非虛方法不推薦使用 new 操作符重新定義,也不能把所有的方法都設定為虛方法,因為這將訂立契約告訴開發人員當前類的派生類可以重新實現所有的方法(虛方法的作用其實是用來描述基類與繼承類的部分功能上的區別的)。除非是基類裡面的方法和派生類中的方法重名的情況才可使用 new 修飾符。這種情況一般出現在基類和派生類已經被大量使用,修改派生類的方法名稱會導致更大的修改,這時我們就可以在派生類中重名的方法上使用 new 操作符。我們在使用 new 修飾符前應該考慮清楚以後可能帶來的後果,如果後其成本比直接修改名稱要高,那麼就應該修改派生類中重名的方法名稱。

二、小結

只有當基類新增的方法名和派生類中的方法名重名時才可使用 new 修飾符,並且使用 new 修飾符前應該考慮清楚以後造成的後果。

new作為修飾符

new 修飾符與 new 操作符是兩個概念 new 修飾符用於宣告類或類的成員,表示隱藏了基類中同名的成員。而new 操作符用於例項化乙個型別 new 修飾符只能用於繼承類,一般用於彌補基類設計的不足 new 修飾符和 override 修飾符不可同時用在乙個成員上,因為這兩個修飾符在含義上互相排斥...

new 修飾符(msdn C 參考)

若要隱藏繼承的成員,請使用相同名稱在派生類中宣告該成員,並使用 new 修飾符對其進行修飾。例如 c public class basec public class derivedc basec 在此示例中,使用 derivedc.invoke 隱藏了 basec.invoke。字段 x 不受影響,...

修飾符 許可權修飾符

四種形式許可權修飾符的訪問情況 publicprotected不寫private 同乙個類中 四種都可以 同一包中的不同類 除了private剩下都可以 不同包下的子類 public protected 可以 不同包下的不同類 只有public可以 許可權修飾符 public protected 預...