以下是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.
}
}
任何人都可以解释上面关于抽象方法和虚方法之间差异的代码吗?
答案 0 :(得分:228)
虚方法有一个实现,并为派生类提供了覆盖它的选项。抽象方法不提供实现,并强制派生类重写该方法。
因此,抽象方法中没有实际代码,子类HAVE TO覆盖该方法。虚方法可以有代码,通常是某些东西的默认实现,任何子类CAN都可以使用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.
}
}
答案 1 :(得分:44)
首先,您应该了解虚拟方法和抽象方法之间的区别。
答案 2 :(得分:4)
抽象方法必须在派生类中调用覆盖,否则它将给出编译时错误 并且在虚拟中你可以或不可以覆盖它取决于它是否足够好用它
示例:
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");
}
}
答案 3 :(得分:3)
抽象方法:
如果在类中定义了抽象方法,那么该类应该 声明为抽象类。
抽象方法应该只包含方法定义,不应该 包含方法体/实现。
虚拟方法:
示例:强>
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;
}
}