这具有多方面的意义。比方,这意味着在基类中引入与派生类中的某个成员具有雷同称号的新成员在 C# 中是完整支撑的,不会致使不测行动。 它还意味着类必需显式声明某要领是要重写一个继承要领,照样一个隐蔽具有相似称号的继承要领的新要领。
在 C# 中,派生类能够包括与基类要领同名的要领。
基类要领必需定义为 virtual。
假如派生类中的要领前面没有 new 或 override 关键字,则编译器将发出正告,该要领将有如存在 new 关键字一样实行操纵。
假如派生类中的要领前面带有 new 关键字,则该要领被定义为独立于基类中的要领。
假如派生类中的要领前面带有 override 关键字,则派生类的对象将挪用该要领,而不是挪用基类要领。
能够从派生类中运用 base 关键字挪用基类要领。
override 、virtual 和 new 关键字还能够用于属性、索引器和事宜中。
假如某个要领被声明为虚要领,则继承该要领的任何类都能够完成它本身的版本。 若要使要领成为虚要领,必需在基类的要领声明中运用 virtual 修饰符。 然后,派生类能够运用 override 关键字重写基虚要领,或运用 new 关键字隐蔽基类中的虚要领。 假如 override 关键字和 new 关键字均未指定,编译器将发出正告,而且派生类中的要领将隐蔽基类中的要领。
GraphicsClass 以下所示:
C#
class GraphicsClass { public virtual void DrawLine() { } public virtual void DrawPoint() { } }
您的公司运用此类,而且您在增加新要领时将其用来派生本身的类:
C#
class YourDerivedGraphicsClass : GraphicsClass { public void DrawRectangle() { } }
您的应用程序运转一般,直到公司 A 宣布了 GraphicsClass 的新版本,相似于下面的代码:
C#
class GraphicsClass { public virtual void DrawLine() { } public virtual void DrawPoint() { } public virtual void DrawRectangle() { } }
开始时,没有涌现任何问题。 新版本依然与旧版本坚持二进制兼容。 已布置的任何软件都将继承一般事情,纵然新类已安装到这些软件地点的计算机体系上。 在您的派生类中,对要领 DrawRectangle 的任何现有挪用将继承援用您的版本。
此正告提醒您必需斟酌愿望 DrawRectangle 要领在应用程序中的事情方式。
假如您愿望本身的要领重写新的基类要领,请运用 override 关键字:
C#
class YourDerivedGraphicsClass : GraphicsClass { public override void DrawRectangle() { } }
派生自 YourDerivedGraphicsClass 的对象仍能够运用基关键字接见DrawRectangle 的基类版本
C#
base.DrawRectangle();
为了防备这两个要领之间发作殽杂,能够重命名您的要领。 这能够很消耗时候且轻易失足,而且在某些状况下并不可行。 然则,假如您的项目相对较小,则能够运用 Visual Studio 的重构选项来重命名要领。 有关更多信息,请拜见重构类和范例(类设想器)。
或许,也能够经由过程在派生类定义中运用关键字 new 来防备涌现该正告:
C#
class YourDerivedGraphicsClass : GraphicsClass { public new void DrawRectangle() { } }
这是默许行动。
重写和要领挑选
下面的要领将是兼容的:
C#
public class Derived : Base { public override void DoWork(int param) { } public void DoWork(double param) { } }
重写要领不被视为是在类上举行声明的,而是在基类上声明的要领的新完成。 仅当 C# 编译器没法将要领挪用与 Derived 上的原始要领婚配时,它才尝试将该挪用与具有雷同称号和兼容参数的重写要领婚配。 比方:
C#
int val = 5; Derived d = new Derived(); d.DoWork(val); // Calls DoWork(double).
有两种要领能够防备此状况。 起首,防备将新要领声明为与虚要领同名。 其次,能够经由过程将 Derived 的实例强迫转换为 Base 来使 C# 编译器搜刮基类要领列表,从而使其挪用虚要领。 由因而虚要领,因而将挪用 Derived 上的 DoWork(int) 的完成。 比方:
C#
((Base)d).DoWork(val); // Calls DoWork(int) on Derived.
有关 new 和 override的更多示例,请拜见 相识什么时候运用 Override 和 New 关键字(C# 编程指南)。
以上就是运用 Override 和 New 关键字举行版本掌握(C# 编程指南)的内容,更多相关内容请关注ki4网(www.ki4.cn)!