• 技术文章 >后端开发 >C#.Net教程

    使用 Override 和 New 关键字进行版本控制(C# 编程指南)

    黄舟黄舟2017-02-16 10:58:17原创771
    原文地址:点击打开链接



    这具有多方面的意义。例如,这意味着在基类中引入与派生类中的某个成员具有相同名称的新成员在 C# 中是完全支持的,不会导致意外行为。 它还意味着类必须显式声明某方法是要重写一个继承方法,还是一个隐藏具有类似名称的继承方法的新方法。

    在 C# 中,派生类可以包含与基类方法同名的方法。

    如果某个方法被声明为虚方法,则继承该方法的任何类都可以实现它自己的版本。 若要使方法成为虚方法,必须在基类的方法声明中使用 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.


    有关 newoverride的更多示例,请参见 了解何时使用 Override 和 New 关键字(C# 编程指南)。

    以上就是使用 Override 和 New 关键字进行版本控制(C# 编程指南)的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!


    php入门到就业线上直播课:查看学习

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:Override ,New ,C#
    上一篇:背后的故事之 - 快乐的Lambda表达式(二) 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• c语言中源文件编译后生成什么文件• c语言标识符有哪些类型• C#中GDI+编程10个基本技巧二• ASP.NET使用Ajax如何返回Json对象的方法具体介绍• 应用绝对路径与相对路径
    1/1

    PHP中文网