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

來源:互聯網
上載者:User

標籤:white   port   sub()   pre   dia   system   沒有   generic   影響   

先來看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、子類可以不ouverride父類的virtual方法,這種情況下他就像普通的父類方法一樣。

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

上代碼:

[csharp] view plain copy
//_______________________________________abstract____________________________________________//


父類-抽象類別:

[csharp] view plain copy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Diagnostics;

namespace TestAppAllHere
{
abstract class TestAbstractSuper
{
public TestAbstractSuper()
{
Debug.WriteLine("這是父類的構造方法");
}

public abstract void Init();

public void Hello()
{
Debug.WriteLine("這是父類的非抽象方法");
}
}
}

抽象類別的子類:
[csharp] view plain copy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Diagnostics;

namespace TestAppAllHere
{
class TestAbstractSub:TestAbstractSuper
{
public TestAbstractSub()
{
Debug.WriteLine("這是子類的構造方法");
}

public override void Init()
{
Debug.WriteLine("這是子類重寫的方法");
}

}
}

調用代碼:
[csharp] view plain copy
<span style="white-space:pre"> </span> TestAbstractSub sub = new TestAbstractSub();
sub.Init();
sub.Hello();

輸出:

[csharp] view plain copy
這是父類的構造方法
這是子類的構造方法
這是子類重寫的方法
這是父類的非抽象方法


[csharp] view plain copy
//_______________________________________virtual____________________________________________//

父類:
[csharp] view plain copy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Diagnostics;

namespace TestAppAllHere
{
class TestVirtualSuper
{
public TestVirtualSuper()
{
Debug.WriteLine("這是父類的構造方法");
}
public virtual void Init()
{
Debug.WriteLine("這是父類的虛擬方法");
}
}
}

子類:
[csharp] view plain copy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Diagnostics;

namespace TestAppAllHere
{
class TestVirtualSub:TestVirtualSuper
{
public TestVirtualSub()
{
Debug.WriteLine("這是子類的構造方法");
}
//___________________沒有重寫這個虛擬方法也是可以照常啟動並執行,會調用父類的虛擬方法_________________________
//___________________重寫了之後父類的虛擬方法不會運行,而是重寫,當然可以用base.來調用父類的方法__________
public override void Init()
{
//base.Init();
Debug.WriteLine("這是子類的重寫方法");
}

}
}
調用代碼:
[csharp] view plain copy
<span style="white-space:pre"> </span> TestVirtualSub sub = new TestVirtualSub();
sub.Init();

輸出:
[csharp] view plain copy
這是父類的構造方法
這是子類的構造方法
這是子類的重寫方法

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.