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____________________________________________//
父類-抽象類:
-
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("這是父類的非抽象方法");
-
}
-
}
-
}
抽象類的子類:
-
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("這是子類重寫的方法");
-
}
-
}
-
}
呼叫程式碼:
-
<span style="white-space:pre"> </span> TestAbstractSub sub = new TestAbstractSub();
-
sub.Init();
-
sub.Hello();
輸出:
-
這是父類的構造方法
-
這是子類的構造方法
-
這是子類重寫的方法
-
這是父類的非抽象方法
//_______________________________________virtual____________________________________________//
父類:
-
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("這是父類的虛擬方法");
-
}
-
}
-
}
子類:
-
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("這是子類的重寫方法");
-
}
-
}
-
}
呼叫程式碼:
-
<span style="white-space:pre"> </span> TestVirtualSub sub = new TestVirtualSub();
-
sub.Init();
輸出:
-
這是父類的構造方法
-
這是子類的構造方法
-
這是子類的重寫方法
全文地址請點選:https://blog.csdn.net/wzj0808/article/details/51388034