前几天看到文哲的博客中有一个关于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)如果类中包含抽象方法,则该类就必须定义成抽象类