C# 中重写虚拟方法

Boo*_*oon 3 c#

在《C# 编程语言》一书中,Eric Lippert 提到了这一点:

这里的一个微妙之处是,重写的虚拟方法仍然被认为是引入它的类的方法,而不是重写它的类的方法。

这句话有什么意义呢?为什么重写的虚拟方法被认为是引入它的类的方法(或其他)很重要,因为除非您正在处理派生类,否则永远不会调用重写的方法?

Guf*_*ffa 5

当一种类型的引用指向另一种类型的对象时,这一点很重要。

例子:

public class BaseClass {
  public virtual int SomeVirtualMethod() { return 1; }
}

public class DerivedClass : BaseClass {
  public override int SomeVirtualMethod() { return 2; }
}

BaseClass ref = new DerivedClass();
int test = ref.SomeVirtualMethod(); // will be 2
Run Code Online (Sandbox Code Playgroud)

由于虚拟方法是基类的成员,因此您可以使用基类类型的引用来调用重写方法。如果不是,您将需要派生类型的引用来调用重写方法。

当您隐藏某个方法而不是重写它时,隐藏方法是派生类的成员。根据引用的类型,您将调用原始方法或隐藏方法:

public class BaseClass {
  public int SomeMethod() { return 1; }
}

public class DerivedClass : BaseClass {
  public new int SomeMethod() { return 2; }
}

BaseClass ref = new DerivedClass();
int test = ref.SomeMethod(); // will be 1

DerivedClass ref2 = ref;
int test2 = ref2.SomeMethod(); // will be 2
Run Code Online (Sandbox Code Playgroud)