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
其他阅读

Apple网页中滚动效果

打开Apple官网查看iPhone页面,我们可以看到一个特殊效果,当你滚动鼠标时,页面不出现滚动效果,但内容却在变化。现在,基于 position : sticky 可以很容易实现这个效果。

查看原文

Nginx代理AspNetCore跨域问题

在前后端分离开发中,经常出现跨域的问题,本文是记录使用Nginx来反向代理AspNetCore应用时的跨域问题

查看原文

HTTP状态码

HTTP状态码为客户端提供了一种理解事务处理结果的边界方式。本文列出一些原因短语,所使用的是HTTP/1.1规范所定义的。

查看原文

命令行打包.net项目

.net 日常开发中,我们接触最多的就是 Visual Studio ,它是微软为了 .net 平台专门打造的 IDE (集成开发环境),为整个 .net 平台开发带来了无与伦比的图形化体验,但是有时候,我们也会遇到需要通过命令行来生成 .net 项目的情况,本文会介绍几种命令行打包的姿势。

查看原文

Web前端中实现一个拖动效果

在原生客户端开发中,窗口拖动是一个比较常用的操作。今天把这个效果在网页客户端中实现以下,文章记录一下效果。

查看原文