在C#中實(shí)現(xiàn)重寫(xiě)方法,可以用new和override兩個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn),究竟他們之間有什么區(qū)別呢?下面,我以例子來(lái)說(shuō)明他們之間的微妙區(qū)別:
public class GrandClass//基類(lèi)
{
public GrandClass()
{
Console.WriteLine("In GrandClass.Constructor");
}
public virtual void Method()//用virtual才可以在子類(lèi)中用override,而new不需要這樣
{
Console.WriteLine("In GrandClass.Method()");
}
}
public class ParentClass:GrandClass//繼承基類(lèi),看看override狀態(tài)
{
public ParentClass()
{
Console.WriteLine("In ParentClass.Constructor");
}
public override void Method()//使用override,是說(shuō)把基類(lèi)的方法重新定義
{
Console.WriteLine("In ParentClass.Method() use override");
}
}
public class NewParentClass:GrandClass//繼承基類(lèi),看看new狀態(tài)
{
public NewParentClass()
{
Console.WriteLine("In NewParentClass.Constructor");
}
new public void Method()//使用new,不是說(shuō)用到基類(lèi)的方法,而是重新定義一個(gè)子類(lèi)方法,只不過(guò),方法名稱(chēng)與基類(lèi)相同
{
Console.WriteLine("In NewParentClass.Method()");
}
}
下面的調(diào)用代碼:
static void Main()
{
GrandClass Parent=(GrandClass)new ParentClass();//用override子類(lèi)加框一個(gè)基類(lèi)對(duì)象句柄
Parent.Method();
GrandClass NewParent=(GrandClass)new NewParentClass();//用new子類(lèi)加框一個(gè)基類(lèi)對(duì)象句柄
NewParent.Method();
NewParentClass NewParent1=new NewParentClass();//一個(gè)子類(lèi)句柄
NewParent1.Method();
}
結(jié)果是這樣的:
[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()
結(jié)果前的序號(hào)是我自己加的.為了以下的分析:
[1],[2]兩句是GrandClass Parent=(GrandClass)new ParentClass();的結(jié)果.(注意一下子類(lèi)構(gòu)建器與基類(lèi)構(gòu)建器的初始化順序)
[3]是Parent.Method();結(jié)果.
[4],[5]兩句是GrandClass NewParent=(GrandClass)new NewParentClass();的結(jié)果.
[6]是NewParent.Method();的結(jié)果.
[7],[8]兩句是GrandClass NewParent1=(GrandClass)new NewParentClass();的結(jié)果.
[9]是NewParent1.Method();的結(jié)果.
這里我們可以看到,同樣是用子類(lèi)的對(duì)象構(gòu)造一個(gè)基類(lèi)句柄.結(jié)果卻很明顯,可以看到[3]和[6]的區(qū)別.[3]調(diào)用了子類(lèi)的Method(),而[6]調(diào)用了基類(lèi)的Method().
這說(shuō)明,override可以覆蓋基類(lèi)的方法,讓基類(lèi)的方法以子類(lèi)的內(nèi)容實(shí)現(xiàn),而new不用來(lái)覆蓋基類(lèi)的方法,而是全新定義一個(gè)子類(lèi)的方法,這個(gè)方法只屬于子類(lèi),與基類(lèi)的方法無(wú)關(guān),只是名字上相同而已.
而這一例子的基礎(chǔ)是建立在用子類(lèi)對(duì)象加框成基類(lèi)對(duì)象的,目的是實(shí)現(xiàn)用基類(lèi)句柄調(diào)用子類(lèi)方法,以實(shí)現(xiàn)重載的多形性.
如果想調(diào)用子類(lèi)的new方法,用子類(lèi)的句柄(絕對(duì)不能用基類(lèi)句柄)來(lái)調(diào)用.結(jié)果[9]可以看出來(lái).
用new是在為子類(lèi)定義方法名時(shí),實(shí)在沒(méi)有辦法定義方法名的情況才與基類(lèi)的方法相同,但這個(gè)方法只在子類(lèi)中起到作用,而不影響基類(lèi)的方法.也就是說(shuō),new方法就是子類(lèi)新定義的方法.用override是直正意義上的重載.