虚方法和抽象方法都可以供派生类重写。
- 虚方法必须有实现部分,抽象方法必须没有实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。如:
class Program
{
static void Main(string[] args)
{
C c = new C();
D d = new D();
}
}
abstract class A
{
public virtual void Sleep()
{
}
public virtual void N(); //报错,虚方法必须有实现部分(方法体).
public abstract void M() //报错
{
}
public abstract void Eat();//抽象方法必须没有实现部分(方法体)
}
class C : A
{
public override void Eat()
{
Console.WriteLine("Eat()被实现");
}
public override void M()
{
Console.WriteLine("M()被实现");
}
}
class D : A //报错,没有实现父类的抽象方法
{
}
2. 抽象方法只能在抽象类中声明;虚方法可以在抽象类中,也可以在非抽象类中。如:
abstract class A
{
public virtual void Sleep()
{
}
public abstract void Eat();
}
class B
{
public virtual void Sleep() //虚方法可以在抽象类中,也可以在非抽象类中
{
}
public abstract void Eat(); //报错,抽象方法不能在非抽象类中
}
3. 抽象方法必须在派生类中重写(1.中class C 与 class D对比),这一点跟接口类似;虚方法可以在派 生类中重写,也可以不重写。虚方法在子类中重写时要加override。如:
class A
{
public virtual void Sleep()
{
}
}
class C : A
{
public override void Sleep()
{
Console.WriteLine("Sleep()被重写");
}
}
class D : A
{
}