C#中new和override的区别

在C#编程语言中,new 和 override 是两个重要的关键字,它们用于控制类成员方法的行为。在面向对象编程(OOP)中,理解这两个关键字的区别和用法,对于编写清晰、可维护和高效的代码至关重要。

首先,我们来看一下 new 关键字。new 关键字用于隐藏基类中的成员方法。具体而言,通过在派生类中使用 new 关键字,可以定义一个与基类方法同名的新方法,从而隐藏基类版本的方法。这种情况下,当使用派生类的实例调用该方法时,编译器会优先考虑派生类中的方法。然而,如果使用基类引用来调用该方法,则仍会执行基类版本的方法。

先写一个 new 关键字的示例:

    public class BaseClass
    {    
        public void ShowMessage()
        {        
            Console.WriteLine("This is the base class message.");    
        }
    }

    public class DerivedClass : BaseClass
    {    
        public new void ShowMessage()
        {        
            Console.WriteLine("This is the derived class message.");    
        }
    }

    BaseClass baseClass = new BaseClass();
    baseClass.ShowMessage(); // 输出: This is the base class message.

    DerivedClass derivedClass = new DerivedClass();
    derivedClass.ShowMessage(); // 输出: This is the derived class message.

    BaseClass baseDerivedClass = new DerivedClass();
    baseDerivedClass.ShowMessage(); // 输出: This is the base class message.

在上面的例子中,DerivedClass 中的 ShowMessage 方法使用了 new 关键字,因此它隐藏了 BaseClass 中的 ShowMessage 方法。当通过 DerivedClass 的实例调用 ShowMessage 时,输出的是 "This is the derived class message."。然而,当通过 BaseClass 的引用来调用时,输出的仍然是基类的方法信息。

与之对比,override 关键字用于重写基类中的虚方法。为了能够重写一个方法,基类中的方法必须用 virtual 关键字进行标记。这表示该方法可以在派生类中被重新定义。使用 override 关键字的好处在于,无论是通过基类引用还是派生类引用调用该方法,都会执行派生类中的实现。

下面是 override 关键字的示例:

    public class BaseClass
    {    
        public virtual void ShowMessage()
        {        
            Console.WriteLine("This is the base class message.");    
        }
    }
    
    public class DerivedClass : BaseClass
    {    
        public override void ShowMessage()
        {        
            Console.WriteLine("This is the derived class message.");    
        }
    }
    
    BaseClass baseClass = new BaseClass();
    baseClass.ShowMessage(); // 输出: This is the base class message.

    DerivedClass derivedClass = new DerivedClass();
    derivedClass.ShowMessage(); // 输出: This is the derived class message.

    BaseClass baseDerivedClass = new DerivedClass();
    baseDerivedClass.ShowMessage(); // 输出: This is the derived class message.

在这个例子中,基类中的 ShowMessage 方法被标记为 virtual,表示它可以在派生类中被重写。DerivedClass 中的 ShowMessage 方法使用 override 关键字对其进行了重写。这确保了无论使用什么类型的引用,调用 ShowMessage 方法时,都会执行派生类中的实现,输出 "This is the derived class message."。

这两种关键字的主要区别在于它们在方法行为控制方面的作用和使用场景。当你希望在派生类中重新定义一个基类方法,但不希望影响基类的行为时,可以使用 new 关键字。这样可以确保通过基类引用调用该方法时,依然执行基类的方法。然而,如果希望派生类能够改变基类方法的行为,并希望通过任何引用调用时都执行派生类的实现,则应该使用 override 关键字。

在面向对象编程中,这种设计提供了更大的灵活性和控制力,使得开发人员可以根据需求选择合适的关键字来实现多态性和代码重用。此外,理解 new 和 override 关键字的区别和正确用法,能够帮助开发人员编写更加清晰、可维护和高效的代码,充分发挥C#语言的强大功能。

通过合理使用这些关键字,可以在代码中实现更复杂的继承关系和多态行为,从而提高代码的可扩展性和灵活性。总之,new 和 override 是C#中两个重要的工具,它们在面向对象编程的世界里扮演着关键角色。理解并正确使用它们,可以使你的代码更加健壮和高效。

发布时间:2024-10-24
其他阅读

Blazor文件上传解决方案

Blazor 是由 Asp.Net Core 团队推出的一个Web前端SPA解决方案,其中包括了使用 WebAssembly 的 Blazor Wasm 和使用 SignalR 进行实时交互的 Blazor server。本篇文章中使用的是 Blazor Wasm 方案来验证上传文件的操作。

查看原文

vscode Material Design Theme

Material Design Theme 是由猪头少年(scung-cn)开发的一套基于 Material Design 设计语言的 Visual Studio Code 主题插件,可以在扩展市场上直接下载安装。

查看原文

C#桌面应用置顶

Winform和WPF开发中,有时会有需要置顶窗体的需求,本文就介绍怎么使用Win32API进行置顶

查看原文

解决ssh登录后闲置一段时间断开

最新新买了一台服务器,使用 ssh 登录之后发现一段时间没有输入就会自动断开,这里记录一下解决方法。

查看原文

git的一些技巧

git 是一个免费开源分布式版本控制系统,可以高效处理从小型到超大型项目内容管理,本文会介绍一些 git 使用的技巧。

查看原文