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

相关推荐
尘浮生3 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
hopetomorrow17 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
小牛itbull27 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
广煜永不挂科34 分钟前
Devexpress.Dashboard的调用二义性
c#·express
请叫我欧皇i35 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落38 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜1 小时前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming19871 小时前
STL关联式容器之set
开发语言·c++
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
GIS 数据栈1 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis