虚拟方法和抽象方法的区别

下面是一些来自MSDN的代码:

// compile with: /target:library
public class D
{
public virtual void DoWork(int i)
{
// Original implementation.
}
}


public abstract class E : D
{
public abstract override void DoWork(int i);
}


public class F : E
{
public override void DoWork(int i)
{
// New implementation.
}
}

有人能就抽象方法和虚拟方法之间的区别来解释上面的代码吗?

289210 次浏览

虚方法有一个实现,并为派生类提供覆盖它的选项。抽象方法不提供实现,也不强制派生类重写该方法。

因此,抽象方法中没有实际的代码,(非抽象的)子类必须重写该方法。虚方法可以有代码,这通常是某个东西的默认实现,任何子类都可以使用override修饰符覆盖该方法并提供自定义实现。

public abstract class E
{
public abstract void AbstractMethod(int i);


public virtual void VirtualMethod(int i)
{
// Default implementation which can be overridden by subclasses.
}
}


public class D : E
{
public override void AbstractMethod(int i)
{
// You HAVE to override this method
}
public override void VirtualMethod(int i)
{
// You are allowed to override this method.
}
}

首先,您应该知道虚拟方法和抽象方法之间的区别。

抽象方法

  • 抽象方法存在于抽象类中,没有主体。
  • 方法必须在非抽象子类中重写。

虚方法

  • 虚方法可以驻留在抽象类和非抽象类中。
  • 在derived中不需要重写虚方法,但可以重写。
  • 虚方法必须有主体....可以被“override关键字”覆盖.....

抽象方法必须在派生类中调用重写,否则将给出编译时错误 在虚拟中,你可以覆盖也可以不覆盖它的依赖如果它足够好,使用它

例子:

abstract class twodshape
{
public abstract void area(); // no body in base class
}


class twodshape2 : twodshape
{
public virtual double area()
{
Console.WriteLine("AREA() may be or may not be override");
}
}

抽象方法:

    如果一个抽象方法定义在一个类中,那么该类应该

    抽象方法应该只包含方法定义,不应该 包含方法体/实现
  • 抽象方法必须在派生类中重写。

虚拟方法:

    虚方法可以在派生类中被重写,但不能 李强制性的。< / > 虚方法必须有方法体/实现

例子:

public abstract class baseclass
{
public abstract decimal getarea(decimal Radius);


public virtual decimal interestpermonth(decimal amount)
{
return amount*12/100;
}


public virtual decimal totalamount(decimal Amount,decimal principleAmount)
{
return Amount + principleAmount;
}
}


public class derivedclass:baseclass
{
public override decimal getarea(decimal Radius)
{
return 2 * (22 / 7) * Radius;
}


public override decimal interestpermonth(decimal amount)
{
return amount * 14 / 100;
}
}