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

C#vs Java-为什么需要虚拟关键字?,c#,java,polymorphism,C#,Java,Polymorphism,我已经开始学习一些C#,我遇到了一件麻烦事:虚拟方法。 这样的关键词有什么必要的动机吗 Java中的一个简单多态性并不要求virtual关键字起作用,甚至覆盖adnotation也是可选的: package figures; public class Figures { public static void main(String[] args) { Figure figure = new Figure(); Circle circle = new Ci

我已经开始学习一些C#,我遇到了一件麻烦事:虚拟方法。 这样的关键词有什么必要的动机吗

Java中的一个简单多态性并不要求virtual关键字起作用,甚至覆盖adnotation也是可选的:

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.");
    }
}
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#认为只有当您明确表示需要虚拟函数时才应该拥有虚拟函数(因此只有在明确允许的情况下才能重写函数)。还有一点性能方面的考虑,因为虚拟函数需要。在Java中,默认情况下,所有方法都是虚拟的,这就是为什么你不需要它们的原因。那为什么在C#中不一样呢?当然,不同的语言-不同的规则,但是对于一种新的语言,应该有一些动机在背后,我想。我猜是因为通过vtable调用方法会对性能造成影响,所以可以被重写的方法应该被显式标记为这样。@Byakuya通过在方法上编写一个带有反向修饰符的Java类——任何在C中没有标记的
virtual
,在Java中都不会有修饰符,任何在Java中标记的
final
在C中都不会有修饰符,作为一种比Java更新的语言,使用virtual关键字的要求困扰着我们。当实例声明为父实例并实例化为子实例时,您可能希望调用父方法版本而不是子方法版本的场景在实际应用程序中非常罕见。这就是为什么Java从无到有地实现多态性,而不需要使用任何关键字。我的观点是,C#是由来自Borland的人创建的,他们使用了Object Pascal的许多原则,就像他们以前创建Borland Delphi一样。对象Pascal具有与virtual关键字相同的要求,并且或多或少使用了virtual方法表。