1. 程式人生 > >c#的abstract和virtual的用法和區別

c#的abstract和virtual的用法和區別

先來看abstract方法,顧名思義,abstract方法就是抽象方法。

1、抽象方法就是沒有實現的,必須是形如

public abstract void Init();

2、擁有抽象方法的類必須修飾一個abstract關鍵字從而變成一個抽象類;但是反過來,抽象類裡面不一定要有抽象方法,比如我寫了一個非抽象類,但是這個類我不想讓人直接例項化,而只讓人繼承,我就可以把他變成一個抽象類,雖然他裡面並沒有抽象方法。形如:

abstract class TestAbstractSuper

3、抽象類不能被例項化,只能被繼承

4、抽象類的子類必須實現每個抽象方法。

5、抽象類裡面除了可以有抽象方法以外,也可以有普通的方法。

6、抽象類的建構函式可以省略,編譯器會自動加上,但是不能是一個抽象方法,而只能是一個普通的建構函式。

小結:簡單概括一下,抽象類不可以直接例項化,他可以有n個(n>=0)抽象方法,這些抽象方法子類必須實現。

再說virtual,他有幾個特點:

1、聲明瞭virtual的方法無需去改動類的宣告,他只在此方法上起到影響。

2、只有virtual的方法可以被子類override

3、子類可以不override父類的virtual方法,這種情況下他就像普通的父類方法一樣。

4. C#中如果要在子類中重寫方法,必須在父類方法前加virtual,在子類方法前新增override,這樣就避免了程式設計師在子類中不小心重寫了父類方法。

小結:簡單概括一下,virtual關鍵字就是告訴子類,此方法可以被override,但非強制。

上程式碼:

//_______________________________________abstract____________________________________________//

父類-抽象類:

  1. using System;

  2. using System.Collections.Generic;

  3. using System.Linq;

  4. using System.Text;

  5. using System.Diagnostics;

  6. namespace TestAppAllHere

  7. {

  8. abstract class TestAbstractSuper

  9. {

  10. public TestAbstractSuper()

  11. {

  12. Debug.WriteLine("這是父類的構造方法");

  13. }

  14. public abstract void Init();

  15. public void Hello()

  16. {

  17. Debug.WriteLine("這是父類的非抽象方法");

  18. }

  19. }

  20. }

抽象類的子類:

  1. using System;

  2. using System.Collections.Generic;

  3. using System.Linq;

  4. using System.Text;

  5. using System.Diagnostics;

  6. namespace TestAppAllHere

  7. {

  8. class TestAbstractSub:TestAbstractSuper

  9. {

  10. public TestAbstractSub()

  11. {

  12. Debug.WriteLine("這是子類的構造方法");

  13. }

  14. public override void Init()

  15. {

  16. Debug.WriteLine("這是子類重寫的方法");

  17. }

  18. }

  19. }

呼叫程式碼:

  1. <span style="white-space:pre"> </span> TestAbstractSub sub = new TestAbstractSub();

  2. sub.Init();

  3. sub.Hello();

輸出:

  1. 這是父類的構造方法

  2. 這是子類的構造方法

  3. 這是子類重寫的方法

  4. 這是父類的非抽象方法

//_______________________________________virtual____________________________________________//

父類:

  1. using System;

  2. using System.Collections.Generic;

  3. using System.Linq;

  4. using System.Text;

  5. using System.Diagnostics;

  6. namespace TestAppAllHere

  7. {

  8. class TestVirtualSuper

  9. {

  10. public TestVirtualSuper()

  11. {

  12. Debug.WriteLine("這是父類的構造方法");

  13. }

  14. public virtual void Init()

  15. {

  16. Debug.WriteLine("這是父類的虛擬方法");

  17. }

  18. }

  19. }

子類:

  1. using System;

  2. using System.Collections.Generic;

  3. using System.Linq;

  4. using System.Text;

  5. using System.Diagnostics;

  6. namespace TestAppAllHere

  7. {

  8. class TestVirtualSub:TestVirtualSuper

  9. {

  10. public TestVirtualSub()

  11. {

  12. Debug.WriteLine("這是子類的構造方法");

  13. }

  14. //___________________沒有重寫這個虛擬方法也是可以照常執行的,會呼叫父類的虛擬方法_________________________

  15. //___________________重寫了之後父類的虛擬方法不會執行,而是重寫,當然可以用base.來呼叫父類的方法__________

  16. public override void Init()

  17. {

  18. //base.Init();

  19. Debug.WriteLine("這是子類的重寫方法");

  20. }

  21. }

  22. }

呼叫程式碼:

  1. <span style="white-space:pre"> </span> TestVirtualSub sub = new TestVirtualSub();

  2. sub.Init();

輸出:

  1. 這是父類的構造方法

  2. 這是子類的構造方法

  3. 這是子類的重寫方法

全文地址請點選:https://blog.csdn.net/wzj0808/article/details/51388034