一文详解C#中重写(override)及覆盖(new)的区别

一文详解C#中重写(override)及覆盖(new)的区别

背景

在C#中,类成员的重写和覆盖是比较常见的概念,但很多人容易混淆二者的区别。本文将详细解释重写和覆盖的概念,并提供示例代码进行解释。

重写(override)

重写表明一个子类的方法将重写基类的方法。必须在子类中使用与父类相同的方法名称、返回类型和参数列表,才能重写基类的方法。子类的方法的访问修饰符必须比基类的方法访问修饰符更为限制。例如,如果基类的方法为public,则子类重写此方法时只能使用public或protected修饰符。

示例

假设我们有一个基类Animal和一个子类Cat,如下所示:

class Animal {
    public virtual void Speak() {
        Console.WriteLine("I'm an animal.");
    }
}

class Cat : Animal {
    public override void Speak() {
        Console.WriteLine("Meow!");
    }
}

var cat = new Cat();
cat.Speak();    // 输出:Meow!

在例子中,Cat类重写了Animal类的Speak方法。在子类中使用override关键字,代表覆盖父类的该方法的实现。

覆盖(new)

覆盖表明在子类中定义一个新的方法,与继承的基类的方法名称、返回类型和参数列表相同。不同于重写,覆盖的方法与基类的方法没有关系,基类的方法在子类中不可见。当使用基类的实例访问这个方法时,只有基类的方法会被调用,不会执行子类中的方法。

示例

继续以AnimalCat类为例:

class Animal {
    public void Speak() {
        Console.WriteLine("I'm an animal.");
    }
}

class Cat : Animal {
    public new void Speak() {
        Console.WriteLine("Meow!");
    }
}

Animal animal1 = new Cat();
animal1.Speak();      // 输出:I'm an animal.

Cat cat1 = new Cat();
cat1.Speak();         // 输出:Meow!

在例子中,Cat类覆盖了Animal类的Speak方法,使用new关键字指示这个方法是一个新的方法,与基类的方法无关。当使用基类的实例访问这个方法时,只有基类的方法会被调用,不会执行子类中的方法。

总结

重写和覆盖在C#语言中属于面向对象编程里的重要概念,它们定义了子类与基类之间的关系,帮助程序员构建正确、有效和易于维护的代码。同时要注意,重写只能用于方法、属性、索引器和事件的重写;而覆盖只能用于方法。

通过以上两条示例,相信大家已经理解了重写和覆盖的区别。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文详解C#中重写(override)及覆盖(new)的区别 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#检查指定对象是否存在于ArrayList集合中的方法

    首先,需要注意的是ArrayList是一个已经过时的集合类,更好的选择是使用List<T>泛型集合。 对于C#检查指定对象是否存在于ArrayList集合中的方法,可以通过ArrayList自带的Contains方法进行判断。Contains方法用于判断一个元素是否存在于ArrayList集合中,如果存在则返回true,否则返回false。 以下…

    C# 2023年5月31日
    00
  • C# DataTable 转换为 实体类对象实例

    将C# DataTable转换为实体类对象实例是一个很常见的操作,下面是详细的攻略。 步骤一:创建实体类 首先创建一个实体类,其中的属性需要与DataTable里面的字段名称和数据类型一一对应。 public class Person { public int Id { get; set; } public string Name { get; set; }…

    C# 2023年6月1日
    00
  • .Net 自定义转换器JsonConverter的使用详解

    .Net 自定义转换器JsonConverter的使用详解 什么是JsonConverter JsonConverter 是Json.NET 库中的一个抽象类,它是一个非常强大和灵活的工具,用于将一个类型的实例转换为 JSON 自定义结构。你可以使用 JsonConverter 来处理各种情况,例如类型转换、数据格式转换、时间日期转换等等,以满足你的特殊需求…

    C# 2023年5月31日
    00
  • C#用链式方法表达循环嵌套

    在C#中,可以使用链式方法表达循环嵌套,以简化代码并提高可读性。本文将介绍如何使用链式方法表达循环嵌套,并提供两个示例。 使用链式方法表达循环嵌套 链式方法是一种在方法调用中使用点号连接多个方法的技术。在C#中,可以使用链式方法表达循环嵌套,以避免使用传统的for循环嵌套。 以下是一个使用链式方法表达循环嵌套的示例: Enumerable.Range(1, …

    C# 2023年5月15日
    00
  • C#实现中英文混合字符串截取的方法

    实现中英文混合字符串截取需要考虑到中文字符的字节数与英文字符的字节数不同,如果简单地使用字符串的截取方法,可能得到的结果会出现乱码或字串不完整的情况。下面介绍几种方法来实现中英文混合字符串截取。 1.使用Substring方法和Char.IsHighSurrogate方法 使用C#字符串类的Substring方法可以很容易地实现字符串的截取操作。然而,为了保…

    C# 2023年6月8日
    00
  • 在Linux中安装ASPNET.Core3.0运行时的示例代码

    在Linux中安装ASP.NET Core 3.0运行时的示例代码 在本文中,我们将详细讲解如何在Linux中安装ASP.NET Core 3.0运行时,并提供两个示例说明。 准备工作 在开始之前,您需要安装以下软件: Linux操作系统(本文以Ubuntu 18.04为例) .NET Core 3.0 SDK 安装ASP.NET Core 3.0运行时 添…

    C# 2023年5月16日
    00
  • 在ASP.NET Core5.0中访问HttpContext的方法步骤

    在ASP.NET Core 5.0中访问HttpContext的方法步骤 在ASP.NET Core 5.0应用程序中,HttpContext是一个非常重要的对象,它提供了许多有用的信息和功能,例如请求和响应对象、用户身份验证信息、会话状态等。本攻略将介绍如何在ASP.NET Core 5.0应用程序中访问HttpContext对象。 步骤 以下是在ASP.…

    C# 2023年5月17日
    00
  • 完美解决c# distinct不好用的问题

    以下是关于“完美解决c# distinct不好用的问题”的完整攻略: 问题描述 在 C# 中使用 Distinct() 方法可以去除一个集合中的重复元素,但是如果需要去除自定义类中的成员变量重复的方法时,经常会遇到以下两个问题: 需要先实现 IEqualityComparer 接口; 直接使用 Distinct() 方法对 List 自定义类对象去重会报错。…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部