C 中new和override區別

2021-09-08 23:38:50 字數 1699 閱讀 7924

在c#中實現重寫方法,可以用new和override兩個關鍵字來實現,究竟他們之間有什麼區別呢?下面,我以例子來說明他們之間的微妙區別:

public class grandclass

//基類

public virtual void method()

//用virtual才可以在子類中用override,而new不需要這樣

}public class parentclass:grandclass

//繼承基類,看看override狀態

public override void method()

//使用override,是說把基類的方法重新定義

}public class newparentclass:grandclass

//繼承基類,看看new狀態

new public void method()

//使用new,不是說用到基類的方法,而是重新定義乙個子類方法,只不過,方法名稱與基類相同

}下面的呼叫**:

static void main()

結果是這樣的:

[1]in grandclass.constructor

[2]in parentclass.constructor

[3]in parentclass.method() use override

[4]in grandclass.constructor

[5]in newparentclass.constructor

[6]in grandclass.method()

[7]in grandclass.constructor

[8]in newparentclass.constructor

[9]in newparentclass.method()

結果前的序號是我自己加的.為了以下的分析:

[1],[2]兩句是grandclass parent=(grandclass)new parentclass();的結果.(注意一下子類構建器與基類構建器的初始化順序)

[3]是parent.method();結果.

[4],[5]兩句是grandclass newparent=(grandclass)new newparentclass();的結果.

[6]是newparent.method();的結果.

[7],[8]兩句是grandclass newparent1=(grandclass)new newparentclass();的結果.

[9]是newparent1.method();的結果.

這裡我們可以看到,同樣是用子類的物件構造乙個基類控制代碼.結果卻很明顯,可以看到[3]和[6]的區別.[3]呼叫了子類的method(),而[6]呼叫了基類的method().

這說明,override可以覆蓋基類的方法,讓基類的方法以子類的內容實現,而new不用來覆蓋基類的方法,而是全新定義乙個子類的方法,這個方法只屬於子類,與基類的方法無關,只是名字上相同而已.

而這一例子的基礎是建立在用子類物件加框成基類物件的,目的是實現用基類控制代碼呼叫子類方法,以實現過載的多形性.

如果想呼叫子類的new方法,用子類的控制代碼(絕對不能用基類控制代碼)來呼叫.結果[9]可以看出來.

用new是在為子類定義方法名時,實在沒有辦法定義方法名的情況才與基類的方法相同,但這個方法只在子類中起到作用,而不影響基類的方法.也就是說,new方法就是子類新定義的方法.用override是直正意義上的過載. 

C 中new和override區別

在c 中實現重寫方法,可以用new和override兩個關鍵字來實現,究竟他們之間有什麼區別呢?下面,我以例子來說明他們之間的微妙區別 public class grandclass 基類 public virtual void method 用virtual才可以在子類中用override,而ne...

c 中,new 和 override 的區別

一 在c 中,new這個關鍵字使用頻率非常高,主要有3個功能 a 作為運算子用來建立乙個物件和呼叫建構函式。b 作為修飾符。c 用於在泛型宣告中約束可能用作型別引數的引數的型別。在本文中,只具體介紹new作為修飾符的作用,在用作修飾符時,new關鍵字可以在派生類中隱藏基類的方法,也就說在使用派生類的...

C 中new和override的區別

在c 中,override和new都會覆蓋父類中的方法。那它們兩者之前有什麼區別呢?以下 的執行結果是什麼?class base public virtual void f2 class derived base public new void f2 class program 或者我們用以下的 更...