为何虚拟方法

时间:2012-10-02 06:27:12

标签: c#

  

可能重复:
  What are Virtual Methods?

在C#中,即使您没有将基类方法声明为虚拟,编译器也会在方法签名匹配时调用最新的派生类方法。 如果没有virtual关键字,我们只会收到警告消息,说明将调用派生方法(现在可以使用new关键字删除)。

当没有此关键字时,将方法声明为虚拟有什么用途,当签名匹配时,也会调用最后派生类中的方法。

我不明白这里的意思。代码可读性目的是“虚拟”吗? 史密斯

2 个答案:

答案 0 :(得分:5)

这不是关于“最新派生方法”。这是关于使用多态时会发生什么。当您在期望父类的上下文中使用派生类的实例时,如果您不使用virtual / override,它将调用父类的方法。

示例:

class A
{
    public int GetFirstInt() { return 1; }
    public virtual int GetSecondInt() { return 2; }
}

class B : A
{
    public int GetFirstInt() { return 11; }
    public override int GetSecondInt() { return 12; }
}

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

int x = a.GetFirstInt(); // x == 1;
x = a.GetSecondInt();    // x == 2;
x = b.GetFirstInt();     // x == 11;
x = b.GetSecondInt();    // x == 12;

但是有以下两种方法

public int GetFirstValue(A theA)
{
   return theA.GetFirstInt();
}

public int GetSecondValue(A theA)
{
   return theA.GetSecondInt();
}

这种情况发生了:

x = GetFirstValue(a);   // x == 1;
x = GetSecondValue(a);  // x == 2;
x = GetFirstValue(b);   // x == 1!!
x = GetSecondValue(b);  // x == 12

答案 1 :(得分:0)

  

可以重新定义虚拟方法。在C#语言中,virtual关键字指定一个可以在派生类中重写的方法。这使您可以添加新的派生类型,而无需修改程序的其余部分。因此,运行时类型的对象决定了程序的功能。

您可以看到详细信息example

public class Base
{
  public int GetValue1()
  {
    return 1;
  }

  public virtual int GetValue2()
  {
    return 2;
  }
}

public class Derived : Base
{
  public int GetValue1()
  {
    return 11;
  }

  public override int GetValue2()
  {
     return 22;
   }
}

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

b.GetValue1();   // prints 1
b.GetValue2();   // prints 11