C# 语言经过专门设计以便不同库中的基类与派生类之间的版本控制可以不断向前发展同时保持向后兼容这具有多方面的意义例如这意味着在基类中引入与派生类中的某个成员具有相同名称的新成员在 C# 中是完全支持的不会导致意外行为它还意味着类必须显式声明某方法是要重写一个继承方法还是一个仅隐藏具有类似名称的继承方法的新方法 C# 允许派生类包含与基类方法名称相同的方法 基类方法必须定义为 virtual 如果派生类中的方法前面没有 new 或 override 关键字则编译器将发出警告该方法将有如存在 new 关键字一样执行操作 如果派生类中的方法前面带有 new 关键字则该方法被定义为独立于基类中的方法 如果派生类中的方法前面带有 override 关键字则派生类的对象将调用该方法而不调用基类方法 可以从派生类中使用 base 关键字调用基类方法 overridevirtual 和 new 关键字还可以用于属性索引器和事件中 默认情况下C# 方法不是虚方法 如果将一种方法声明为虚方法则继承该方法的任何类都可以实现其自己的版本若要使方法成为虚方法必须在基类的方法声明中使用 virtual 修饰符然后派生类可以使用 override 关键字重写基虚方法或使用 new 关键字隐藏基类中的虚方法如果 override 关键字和 new 关键字均未指定编译器将发出警告并且派生类中的方法将隐藏基类中的方法 class A { public A() { ConsoleWriteLine(A); } public virtual void Fun() { ConsoleWriteLine(AFun()); } public virtual void Fun() { ConsoleWriteLine(AFun()); } public void Fun() { ConsoleWriteLine(AFun()); } } class B : A { public B() { ConsoleWriteLine(B); } public new void Fun() { ConsoleWriteLine(BFun()); } public override void Fun() { ConsoleWriteLine(BFun()); } public void Fun() { ConsoleWriteLine(BFun()); } } static void Main(string[] args) { A a = new B(); aFun(); aFun(); aFun(); ConsoleRead(); } 输出 A B AFun() BFun() AFun() —— OVERRIDE和NEW的方法都必须是基类中VIRTUAL或ABSTRACT的方法 —— OVERRIDE的方法是可以通过BASE前缀调用基类中被OVERRIDE的方法的 —— NEW的方法是一个全新的方法不能使用BASE前缀来调用基类中被NEW后的方法 override覆盖(旧的没有了) new新的(新旧共存) new关键字就是终止该方法的虚拟性比如 class A { public abstract void func(){}; } class B:A { public override void func(){}; } class C:B { public new void func(){}; } 那么你可以 A a = new B(); afunc(); 但不能这么做 A a = new C(); afunc(); 而且也不能再override这个方法因为这个方法已经被终止了虚拟属性所以不能这样 class D:C { public override void func(){}; } |