前幾天看到文哲的博客中有一個關於virtual和 abstract的區別問題。可以說當時也是模稜兩可,也不太確定具體有什麼區別,今天查了查,稍微有點收獲,希望對您有所幫助:
1、先說虛方法 virtual
虛方法有自己的函數體,已經提供了函數實現,但是允許在子類中重寫或覆蓋。重寫的子類虛函數就是被覆蓋了。下面就來具體舉個例子來說明一下:
首先建立父類Animal,其中包含虛方法 Shout()
classAnimal
{
public virtual string Shout()
{
return "動物";
}
}
//子類Dog繼承父類Animal
classDog : Animal
{
}
主函數中寫如下程序:
classProgram
{
static void Main(string[] args)
{
Animal dog1 = new Dog();
Console .WriteLine ( dog1.Shout());
}
}
得到的結果如下:
如果將上面的子類Dog中復寫父類中的方法Shout(),即將其改成下面的代碼:
classDog : Animal
{
public override string Shout()
{
return "狗";
}
}
主函數不變,則其結果如下:
2、在看抽象abstract
其分抽象類和抽象方法
1)一般在類前面加上abstract就成抽象類了,抽象類其不能被實例化,就像抽象類Animal,其實例化的結果也沒有任何意義;
2)抽象方法和抽象類一樣,在返回值前加abstract就成抽象方法了。抽象方法沒有方法體,直接在括號後面加“;”即可。如下:
abstract class Animal
{
protected abstract string getShoutSound();
}
3)抽象方法必須要被子類重寫
4)如果類中包含抽象方法,則該類就必須定義成抽象類