想知道以下之间有什么区别:
案例 1:基类
public void DoIt();
案例一:继承类
public new void DoIt();
案例 2:基类
public virtual void DoIt();
案例2:继承类
public override void DoIt();
根据我运行的测试,案例 1 和 2 似乎具有相同的效果。有区别还是首选方式?
override 修饰符可以用在虚方法上,而且必须用在抽象方法上。这表明编译器使用方法的最后定义实现。即使在对基类的引用上调用该方法,它也会使用覆盖它的实现。
public class Base { public virtual void DoIt() { } } public class Derived : Base { public override void DoIt() { } } Base b = new Derived(); b.DoIt(); // Calls Derived.DoIt
Derived.DoIt如果覆盖将调用Base.DoIt。
Derived.DoIt
Base.DoIt
new 修饰符指示编译器使用您的子类实现而不是父类实现。任何不引用您的类但父类的代码都将使用父类实现。
public class Base { public virtual void DoIt() { } } public class Derived : Base { public new void DoIt() { } } Base b = new Derived(); Derived d = new Derived(); b.DoIt(); // Calls Base.DoIt d.DoIt(); // Calls Derived.DoIt
会先打电话Base.DoIt,然后Derived.DoIt。它们实际上是两个完全独立的方法,它们恰好具有相同的名称,而不是覆盖基本方法的派生方法。