C#之virtual 和abstract


前几天看到文哲的博客中有一个关于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());
    }
}

得到的结果如下:

C#之virtual 和abstract

如果将上面的子类Dog中复写父类中的方法Shout(),即将其改成下面的代码:

classDog : Animal
{
    public override string Shout()
    {
        return "狗";
    }
}

主函数不变,则其结果如下:

C#之virtual 和abstract


2、在看抽象abstract

其分抽象类和抽象方法

1)一般在类前面加上abstract就成抽象类了,抽象类其不能被实例化,就像抽象类Animal,其实例化的结果也没有任何意义;

2)抽象方法和抽象类一样,在返回值前加abstract就成抽象方法了。抽象方法没有方法体,直接在括号后面加“;”即可。如下:

abstract class Animal

{

protected abstract string getShoutSound();

}

3)抽象方法必须要被子类重写

4)如果类中包含抽象方法,则该类就必须定义成抽象类

相关内容