C#中Override与New关键字的运用及实例解析

文章目录


在C#编程中,override 和 new 关键字用于处理类的继承和方法的重写。理解它们的用法和区别对于编写清晰和高效的面向对象代码至关重要。本文将详细阐述这两个关键字的含义、使用场景,并提供具体示例来帮助读者更好地理解它们在C#中的作用。

override 关键字

含义

override 关键字用于在派生类中重写基类中已经标记为 virtual 或 abstract 的方法、属性或索引器。通过使用 override,你可以提供一个具体的实现来替代基类的默认实现。这允许你在继承层次结构中定义不同的行为,同时保留方法签名的一致性。

使用场景

多态性:当你希望通过基类引用调用派生类中的方法时,使用 override 关键字。这是实现多态的基础。

基类成员标记:基类中的方法、属性或索引器必须被标记为 virtual 或 abstract 才能在派生类中使用 override。
示例

csharp 复制代码
using System;

public class Animal
{
    // 基类中的虚方法
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal makes a sound.");
    }
}

public class Dog : Animal
{
    // 重写基类中的虚方法
    public override void MakeSound()
    {
        Console.WriteLine("Dog barks.");
    }
}

public class Program
{
    public static void Main()
    {
        Animal myDog = new Dog();
        myDog.MakeSound();  // 输出: Dog barks.
    }
}

解释

在上面的示例中:

  1. Animal 类中的 MakeSound 方法被标记为 virtual,允许在派生类中重写。
  2. Dog 类重写了 MakeSound 方法,提供了一个新的实现。
  3. 通过 Animal 类型的引用 myDog 调用 MakeSound 方法时,实际执行的是 Dog 类中的实现,这显示了多态的特性。

new 关键字

含义

new 关键字用于在派生类中隐藏基类中的成员(方法、属性或字段)。这不是对基类成员的重写,而是创建一个新的成员。这种隐藏关系不会影响基类的行为,且隐藏的成员不会参与多态性。

使用场景

隐藏基类成员:当你在派生类中需要一个新的实现,而不影响基类的实现时,使用 new 关键字。

不需要多态性:当你不打算通过基类引用访问派生类中的成员时,使用 new。
示例

csharp 复制代码
using System;

public class Parent
{
    public void Show()
    {
        Console.WriteLine("Parent Show");
    }
}

public class Child : Parent
{
    // 使用 new 关键字隐藏基类中的方法
    public new void Show()
    {
        Console.WriteLine("Child Show");
    }
}

public class Program
{
    public static void Main()
    {
        Parent parent = new Parent();
        Parent childAsParent = new Child();
        Child child = new Child();

        parent.Show();             // 输出: Parent Show
        childAsParent.Show();     // 输出: Parent Show
        child.Show();             // 输出: Child Show
    }
}

解释

在上面的示例中:

  1. Parent 类中的 Show 方法在 Child 类中被隐藏。
  2. Child 类中的 Show 方法使用了 new 关键字,因此 Parent 类的 Show 方法仍然存在。
  3. 通过 Parent 类型的引用 childAsParent 调用 Show 方法时,调用的是 Parent 类中的实现,而不是 Child 类中的实现。这表明 new 关键字不会影响多态性。

使用注意事项和最佳实践

1. 选择 override 时:

  • 确保基类中的成员方法、属性或索引器被标记为 virtual 或 abstract。
  • 使用 override 实现多态性,允许通过基类引用调用派生类的实现。

2. 选择 new 时:

  • 了解 new 关键字隐藏了基类中的成员,不会参与多态性。
  • 使用 new 时,基类和派生类中的成员是两个不同的成员,调用哪个实现取决于引用的类型。

3. 避免混淆:

  • 在同一个类中使用 override 和 new 关键字可能会导致代码阅读困难。明确你需* 要的行为,以选择适当的关键字。

4. 检查警告:

  • 编译器会在使用 new 关键字隐藏基类成员时发出警告。审视这些警告并决定是否需要隐藏基类成员,避免潜在的错误。

总结

override 和 new 是 C# 中处理继承和多态性的关键字。使用 override 可以重写基类中的虚方法,实现多态性,使得运行时能够调用到派生类的实现。而使用 new 则隐藏基类中的成员,创建新的实现,这种隐藏不会影响基类的行为,也不参与多态性。理解这两个关键字的区别和适用场景对于编写健壮和可维护的代码至关重要。

相关推荐
小羊没烦恼!10 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
神仙别闹10 小时前
基于C#+MySQL实现(WinForm)个人聊天室软件
c#
伞伞悦读11 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车11 小时前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁12 小时前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
kybs199112 小时前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
孙启超13 小时前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int13 小时前
深入理解C++系列(20)——C++11(下)
开发语言·c++
CoderYanger14 小时前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
伞伞悦读15 小时前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json