c#中的虚拟关键字

Vic*_*jee 7 c# virtual

我对java有所了解,过去几天一直在学习c#.现在我遇到了"虚拟"关键字,正如此链接所示,它用于允许在子类中覆盖相应的方法,属性等.现在我认为即使不使用"virtual"关键字也可以覆盖方法.那为什么有必要呢?

Tho*_*mar 12

virtual如果你真的想要override子类中的方法,你需要关键字.否则,基本实现将被新实现隐藏,就像您使用new关键字声明它一样.

通过"覆盖"它们而没有声明基本方法来隐藏方法virtual会使您没有多态性,这意味着:如果您将专用版本"转换"为"基本"版本并调用方法,则始终使用基类实现被覆盖的版本 - 这不是你所期望的.

例:

class A
{
    public void Show() { Console.WriteLine("A"); }
}

class B : A
{
    public void Show() { Console.WriteLine("B"); }
}

A a = new A();
B b = new B();

a.Show(); // "A"
b.Show(); // "B"

A a1 = b;
a1.Show(); // "A"!!!
Run Code Online (Sandbox Code Playgroud)


Lev*_*lho 7

virtual是一种定义方法具有默认实现的方法,但该实现可以在子类中重写.除了使用虚拟之外,您不能在不使用new关键字的情况下直接覆盖方法(这通常是不好的做法).

实现的一个很好的例子virtualToString()方法.C#中的每个对象都保证能够调用,ToString()因为每个对象都继承自System.Object包含虚方法的基类ToString().然而,派生类可以覆盖它,并提供它们自己的实现,这对对象的用户可能更有用.

更新:我最近写了一篇博文,深入探讨了这个主题.在这里查看.