標籤: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 的區別與用法