對虛方法 重寫 過載的認識

2022-11-24 18:27:07 字數 3984 閱讀 7315

1、虛方法的概念:

類中的方法宣告前加上了virtual 修飾符,我們稱之為虛方法;

如:  class a

public virtual void f(){} //虛方法

virtual修飾符表明:該基類(本例中指a類)的派生類(本例中指b類)可以

重寫該方法(本例中指方法f())。

如:  class b:a

public override void f(){} //派生類b重寫類a的虛

方法f()

與之相對的,沒有用virtual 修飾符,我們稱之為非虛方法。

2、重寫的概念:

是子類(即派生類)的方法覆蓋父類(即基類)的虛方法。

重寫的要求:

1、三相同:

(1)方法名稱相同

(2)引數列表相同

(3)返回值型別相同

一句話,只需重寫**體的內容!

2、重寫宣告不能更改虛方法的可訪問性:重寫方法和虛方法必須具有相同的訪問級修飾符。例如:虛方法為public的,重新方法也必須是public的。

3、可以重寫基方法:必須是虛擬的(virtual)、抽象的(abstract)或重寫的(override)。(非虛方法或靜態方法是不可以重寫的)

4、不能使用下列修飾符修改重寫(override)方法(即該方法中含有override關鍵字):new、static、virtual、abstract

如:new public override void outwork () //這樣寫是不可以的

messagebox.show("子類的子類(override)下班");

5、重寫屬性:重寫的屬性必須與繼承屬性有完全相同的訪問修飾符、型別和屬性名,並且重寫屬性必須是虛擬的(virtual)、抽象的(abstract)或是重寫的(override)。

6、new關鍵字和override關鍵字比較:

如果使用override重寫xx方法,通過父類引用一樣只能看到重寫後的方法; override重寫的是虛方法,那麼就只剩下重寫以後的方法,原來的方法被覆蓋了。

如果使用new隱藏xx方法,父類子類引用各自對應方法;

new隱藏基類的方法,那麼基類的方法和當前類的方法同時存在只是被隱藏了。

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

舉例說明:

例一:

using system;

class a

public void f( )

public virtual void g( )//虛方法,在其子類中可以被重寫

class b:a

new public void f( )

public override void g( )

class test

static void main( )

b b=new b( );

a a=b;

a.f( ); //值為a.f

b.f( ); //值為b.f

a.g( ); //值為b.g,因為虛方法g()被重寫了

b.g( ); //值為b.g

例二:class a  

public   virtual   void   f()     

class b: a  

public   override   void   f()     

class c: b  

new   public   virtual   void   f()     

class d: c  

public   override   void   f()     

class test  

static   void   main()  

d d = new d();  

c c = d;

b b = d;

a a = d;                

a.f();  //值為b.f 

b.f();  //值為b.f

c.f();  //值為d.f 

d.f();  //值為d.f 

例三:abstract和override使用方法:注:只有當類是abstract時才可以宣告abstract方法;

abstract class animal

public abstract void drink();

public abstract void gotobed();

class dog : animal

public override void drink()

messagebox.show("小狗喝水");

public override void gotobed()

messagebox.show("小狗睡覺");

public override string tostring()//也可:public new string tostring()

return "小狗";

總結:public abstract void pay();           abstract方法沒有方法實現,必須繼承

public sealed override void pay(){}  sealed方法必須是重寫父類的方法

public static void pay(){}               static方法通過類名訪問

public virtual void pay(){}              virtual方法子類可以對其override或new

public new void pay(){}                父類的方法pay不一定是virtual也可以為非虛方法

public override void pay(){}             父類的方法pay一定要是virtual

例四:new、abstract、virtual、override關鍵字的使用**示例:

public abstract class people //abstract說明類people是一個抽象類不能被例項的,只能被繼承

public people()//建構函式

public void work() //非虛方法

messagebox.show("開始工作!");

public virtual void getoffwork() //虛擬函式,說明此方法可以被子類重寫覆蓋(override)

messagebox.show("下班啦!");

public class manage:people //繼承popele類

public manage()//建構函式

new public void work()

/*因為基類已經實現了work方法,而在子類中又實現了work方法,所以編譯會報警,在前面加上 new(隱藏基類方法),是將警報關閉,這樣就不會報錯。*/

base.work(); //呼叫基類popele的方法。顯示“開始工作”

public override void getoffwork() //重寫覆蓋people類的方法

messagebox.show("管理員下班啦");

以上應該總結幾點:

1、   如果父類方法沒有加virtual關鍵字,即不是一個虛方法,則在子類中只能隱藏基類方法

(new),而不能覆蓋(override)。

2、如果父類方法加了virtual關鍵字,即它是一個虛方法,在子類中一樣可以隱藏(new)。

3、如果子類實現了父類相同的方法(相同的方法名稱及簽名),而沒有new,在編譯時會報警,但

編譯仍然能夠通過!

3、呼叫父類方法:base.方法名()

4、abstract類是一個抽象類,不能被例項化,只能繼承

3、最後講講過載(overload):是在同一個類中的兩個或兩個以上的方法,擁有相同的方法

名,函式型別也相同,但是引數卻不相同,最常見的過載的例子就是類的建構函式。