gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:52 26 4
gpt4 key购买 nike

我已经开始学习一些 C# 并且遇到了一个令人不安的问题:虚拟方法。是否有必要使用此类关键字的动机?

Java 中的一个简单多态性不需要 virtual 关键字就可以工作,甚至 Override 注释也是可选的:

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# 中,同一示例需要 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.");
}
}

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

最佳答案

在 Java 中,方法默认是虚拟的。在 C# 中,它们不是,并且必须标记为虚拟才能使多态性起作用。

这是理念上的差异。 Java 的理念是默认虚拟方法使您可以轻松地随意扩展类。另一方面,C# 认为只有在您明确表示需要虚函数时才应该使用它们(因此只有在明确允许的情况下才能重写函数。)有一个轻微的性能考虑,因为虚函数需要 an additional level of indirection .

关于C# vs Java - 为什么需要 virtual 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21784200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com