C# 虚拟方法与抽象方法的区别
以下是来自以下网站的一些代码:C# 虚拟方法与抽象方法的区别,c#,C#,以下是来自以下网站的一些代码: 有人能解释一下上述代码中抽象方法和虚拟方法之间的区别吗?虚拟方法有一个实现,并为派生类提供了重写它的选项。抽象方法不提供实现,并强制派生类重写该方法 因此,抽象方法中没有实际的代码,子类必须重写该方法。虚拟方法可以有代码,这通常是某个东西的默认实现,任何子类都可以使用override修饰符重写该方法,并提供自定义实现 public abstract class E { public abstract void AbstractMethod(int i);
有人能解释一下上述代码中抽象方法和虚拟方法之间的区别吗?虚拟方法有一个实现,并为派生类提供了重写它的选项。抽象方法不提供实现,并强制派生类重写该方法 因此,抽象方法中没有实际的代码,子类必须重写该方法。虚拟方法可以有代码,这通常是某个东西的默认实现,任何子类都可以使用
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.
}
}
首先,您应该知道虚拟方法和抽象方法之间的区别 抽象方法
- 抽象方法驻留在抽象类中,并且没有主体
- 必须在非抽象子类中重写抽象方法
- 虚方法可以驻留在抽象类和非抽象类中
- 不必重写派生中的虚方法,但可以重写
- 虚拟方法必须具有主体…可以由“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;
}
}
- 如果在类中定义了抽象方法,则该类应 声明为抽象类
- 抽象方法应仅包含方法定义,而不应包含
包含方法体/实现
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. } }
- 抽象方法必须在派生类中优先使用
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;
}
}
- 虚拟方法可以在派生类中使用,但不能在派生类中使用 强制性的
- 虚拟方法必须具有方法体/实现 根据定义
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;
}
}
你的具体问题是什么,你还不明白什么?你从@DanielHilgarth复制的每一件东西都更新了我的问题。请看一看。@Anandkumar我只复制了抽象类和类成员代码部分。看一看,放得漂亮!但是有一个问题……对于子类中的抽象方法,您是否必须显式地声明
override
[因为它是必须被覆盖的]?对于抽象方法,您必须显式地声明它,是的。对于虚拟方法,它更复杂。如果不在此处声明override
关键字,则原始方法将被隐藏。如果这是您的意图,您可以使用new
关键字来消除警告,但是想要隐藏方法的情况非常罕见。因此,除非您特别想使用方法隐藏,否则您应该始终使用override
关键字我们如何在类E之外调用类E虚拟方法?@Jaydeep Shil您不能,也不应该。如果D重写虚拟方法,则意味着该代码应该从外部使用。如果E VirtualMethod()具有实现,则意味着它具有用法,否则可以声明为抽象。抽象方法必须在非抽象子类中重写。它不是那样的,您也可以在抽象类中重写它。