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 则隐藏基类中的成员,创建新的实现,这种隐藏不会影响基类的行为,也不参与多态性。理解这两个关键字的区别和适用场景对于编写健壮和可维护的代码至关重要。

相关推荐
2401_858286111 分钟前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py3 分钟前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy3 分钟前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
C-SDN花园GGbond2 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处2 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ3 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
leon6253 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
锦亦之22334 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
我是苏苏4 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
姜太公钓鲸2334 小时前
c++ static(详解)
开发语言·c++