一文详解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#递归算法

    经典实例讲解C#递归算法攻略 什么是递归算法 递归算法通过自身不断的调用自身来实现计算。它是一种比较常用的算法,可以用来解决很多复杂问题。 递归算法的特点 递归算法有以下几个特点: 递归调用必须有结束条件 函数调用自身 函数每次调用的参数不同 C#递归算法的示例 示例1:阶乘运算 阶乘是指一个数的阶乘是所有比它小的正整数的积。例如,5的阶乘为54321=12…

    C# 2023年6月6日
    00
  • C#面向对象特征的具体实现及作用详解

    C#面向对象特征的具体实现及作用详解 面向对象的三大特征 在C#编程中,实现面向对象编程的三大特征是:封装、继承和多态。 封装 封装是一种将数据和代码进行合理组织的过程。对于一个类来说,封装意味着将数据和方法打包在一起,控制数据的访问级别以及提供对数据的安全访问。在C#中,可以通过访问修饰符限制属性和方法的访问级别,达到封装的目的。 继承 继承是一种允许一个…

    C# 2023年6月6日
    00
  • C#中foreach语句使用break暂停遍历的方法

    当我们使用 foreach 遍历一个集合时,可能有时候需要在集合中某些条件满足时暂停遍历,这时我们可以使用关键字 break 来实现。下面我们来介绍一下 C# 中 foreach 语句使用 break 暂停遍历的方法。 1. 使用 break 暂停遍历 在 foreach 循环中使用 break 关键字可以在满足某些条件时停止循环,即跳出循环。 例如,我们需…

    C# 2023年6月7日
    00
  • C#编程获取各种电脑硬件信息的方法示例

    C#是一种流行的面向对象编程语言,可以获取电脑硬件信息,并且是比较容易实现的。下面,我将分享一些示例代码,用以获得各种电脑硬件信息的方法。 硬件信息获取方法一:使用System.Management命名空间 System.Management命名空间提供了一种获取WMI(Windows Management Instrumentation)服务的方法,该服务…

    C# 2023年6月7日
    00
  • NetCore 使用 Swashbuckle 搭建 SwaggerHub

    什么是SwaggerHub? Hub 谓之 中心, 所以 SwaggerHub即swagger中心. 什么时候需要它? 通常, 公司都拥有多个服务, 例如商品服务, 订单服务, 用户服务, 等等, 每个服务都有自己的environment, endpoint, swagger schema. 然而这些信息都分散在各处, 如果能集中在一个地方展示出来, 就能减…

    C# 2023年4月18日
    00
  • C#实现根据图片的链接地址获取图片的后缀名

    当我们给很多图片命名时,我们通常会使用图片的结尾部分作为图片的后缀名。因此,获取图片的后缀名是一项非常常见的任务。在C#中,我们可以通过一定的代码实现获取图片的后缀名。 首先,我们需要明确一下目标:根据图片的链接地址获取图片的后缀名。这个目标可以分解为以下几个步骤: 从链接地址中获取图片的文件名; 将文件名转换成小写形式; 从文件名中获取后缀名。 以下是详细…

    C# 2023年6月1日
    00
  • java servlet结合Oracle搭建java的web开发环境

    javaservlet结合Oracle搭建java的web开发环境 在Java的Web开发中,常常需要使用Java Servlet和Oracle数据库。本文将介绍如何结合Java Servlet和Oracle搭建Java的Web开发环境。 步骤1:安装Oracle数据库 首先,我们需要安装Oracle数据库。可以从Oracle官网下载并安装Oracle数据库…

    C# 2023年5月15日
    00
  • C#简单邮件群发通用类

    首先我们需要明确什么是C#邮件群发通用类。它是一种在C#编程语言下编写的针对邮件群发的通用类,可以基于.NET Framework的邮件类库(如SmtpClient)来快速发送“批量邮件”。下面是介绍如何编写和使用C#简单邮件群发通用类的步骤: 编写邮件群发通用类 1. 创建C#项目 在Visual Studio中创建一个新的控制台应用程序,我们将在该项目下…

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