[英]C# vs Java - why virtual keyword is necessary?
我开始学习一些C#,我遇到了一个令人不安的问题:虚拟方法。 是否有必要使用此关键字?
Java中的简单多态不会要求虚拟关键字起作用,即使覆盖注释是可选的:
package figures;
public class Figures {
public static void main(String[] args) {
Figure figure = new Figure();
Circle circle = new Circle();
Triangle triangle = new Triangle();
Figure []arrayOfFigures = {figure, circle, triangle};
for (int i = 0; i < 3; i++){
arrayOfFigures[i].introduceYourself();
}
}
}
class Figure {
public void introduceYourself(){
System.out.println("I am just a figure.");
}
}
class Circle extends Figure {
@Override
public void introduceYourself() {
System.out.println("I am a circle.");
}
}
class Triangle extends Figure {
@Override
public void introduceYourself() {
System.out.println("I am a triangle.");
}
}
在C#中,同样的示例需要virtual
和override
关键字才能工作:
namespace Figures
{
class Figures
{
static void Main(string[] args)
{
Figure figure = new Figure();
Circle circle = new Circle();
Triangle triangle = new Triangle();
Figure[] arrayOfFigures = { figure, circle, triangle };
for (int i = 0; i < 3; i++)
{
arrayOfFigures[i].IntroduceYourself();
}
}
}
}
class Figure
{
public virtual void IntroduceYourself()
{
System.Console.WriteLine("I am just a simple figure.");
}
}
class Circle : Figure
{
public override void IntroduceYourself()
{
System.Console.WriteLine("I am a circle.");
}
}
class Triangle : Figure
{
public override void IntroduceYourself()
{
System.Console.WriteLine("I am a triangle.");
}
}
通常有动机将一些关键词引入语言。 由于C#是在Java和许多其他面向对象语言之后创建的,我想知道是否有理由引入强制性(多态性工作) virtual
和override
关键字?
在Java中,默认情况下方法是虚拟的。 在C#中,它们不是,并且必须标记为虚拟,以便使多态性起作用。
这是哲学上的一个不同之处。 Java的理念是,默认的虚拟方法使您可以随意扩展类。 另一方面,C#表明,当你明确表示需要虚拟函数时,你应该只有虚函数(因此只有在明确允许的情况下才能覆盖函数。)有一点性能考虑,因为虚函数需要额外的级别间接的 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.