C#vs Java - 为什么需要虚拟关键字?

3ya*_*uya 8 c# java polymorphism

我开始学习一些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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

在C#中,相同的示例需要两个virtualoverride关键字才能工作:

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.");
        }
    }
Run Code Online (Sandbox Code Playgroud)

通常有动机将一些关键词引入语言.由于C#是在Java和许多其他面向对象的语言之后创建的,我想知道是否有理由引入强制性(用于多态性)virtualoverride关键字?

Mat*_*ine 10

在Java中,默认情况下方法是虚拟的.在C#中,它们不是,并且必须标记为虚拟,以便使多态性起作用.

这是哲学上的一个不同之处.Java的理念是,默认的虚拟方法使您可以随意扩展类.另一方面,C#表示当你明确表示需要它时你应该只有虚函数(因此只有在明确允许的情况下才能覆盖函数.)有一点性能考虑,因为虚函数需要额外的级别间接的.

  • 我的观点是,C# 是由来自 Borland 的人创建的,他们使用了 Object Pascal 的许多原理,就像他们之前创建的 Borland Delphi 一样。Object Pascal 对 virtual 关键字有相同的要求,并且对虚拟方法表的使用或多或少相同。 (2认同)