首页 > 编程语言 >C#中重写(override)及覆盖(new)的区别详解

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

时间:2023-03-27 17:00:46浏览次数:48  
标签:Console C# 重写 子类 override new 父类 方法

1. 重写和覆盖的定义

1.1 重写(override)的定义

  在C#中,用override关键字来重写一个父类中的虚方法或抽象方法。override关键字用于指示编译器,我要用派生类中的一个方法,重写基类中的同名方法。通过重写基类中的方法,可以实现多态性。有关重写与虚方法和抽象方法的详细示例,可移步C#虚方法和抽象方法示例

override关键字的语法如下:

public override returnType MethodName(ParameterList)
{
    // 方法实现
}

其中,public表示访问修饰符;override表示重写虚方法或抽象方法;returnType表示方法的返回类型;MethodName表示方法名称;ParameterList表示方法的参数列表。

需要注意的是,重写方法的访问修饰符必须与被重写方法的访问修饰符相同或更为宽松。

1.2 覆盖(new)的定义

  在C#中,用new关键字来覆盖一个父类中的成员方法或成员变量。new关键字用于指示编译器,派生类中的一个方法或变量将隐藏基类中的同名方法或变量,从而改变了继承体系中的原有布局关系。
new关键字的语法如下:

new returnType MemberName(ParameterList)
{
    // 成员实现
}

其中,returnType表示成员的返回类型;MemberName表示成员的名称;ParameterList表示成员的参数列表。

2. 两者的区别及示例

下面是一个示例:

//父类
  public class FatherClass
  {
    public virtual string GetName()
    {
      return "我是父类中的虚拟方法";
    }
  }
  //子类1
  public class SonClass1 : FatherClass
  {
    public override string GetName()
    {
      return "我是子类1中的重写方法";
    }
  }
  //子类2
  public class SonClass2 : FatherClass
  {
    public new string GetName()
    {
      return "我是子类2中的覆盖方法";
    }
  }

随后通过程序入口函数调用:

 public class Program
  {
    public static void Main(string[] args)
    {
      FatherClass fatherClass = new FatherClass();
      Console.Write("直接调用父类中的虚方法:");
      Console.WriteLine(fatherClass.GetName());

      SonClass1 s1 = new SonClass1();
      Console.Write("直接调用子类1中的重写方法:");
      Console.WriteLine(s1.GetName());

      SonClass2 s2 = new SonClass2();
      Console.Write("直接调用子类2中的覆盖方法:");
      Console.WriteLine(s2.GetName());

      FatherClass f1 = new SonClass1();
      Console.Write("声明父类,调用子类1中的重写方法:");
      Console.WriteLine(f1.GetName());

      FatherClass f2 = new SonClass2();
      Console.Write("声明父类,调用子类2中的覆盖方法:");
      Console.WriteLine(f2.GetName());
    }
  }

运行程序,得到的结果如下:

直接调用父类中的虚方法:我是父类中的虚拟方法
直接调用子类1中的重写方法:我是子类1中的重写方法
直接调用子类2中的覆盖方法:我是子类2中的覆盖方法

声明父类,调用子类1中的重写方法:我是子类1中的重写方法
声明父类,调用子类2中的覆盖方法:我是父类中的虚拟方法

总结

1:不管是重写还是覆盖都不会影响父类自身的功能。

2:当用子类创建父类的时候,如 FatherClass f1 = new SonClass1(),重写会改变父类的功能,即调用子类的功能;而覆盖不会,仍然调用父类功能。

3:虚方法、实方法都可以被覆盖(new),但是抽象方法,接口 不可以。

4:抽象方法,接口,标记为virtual的方法可以被重写(override),实方法不可以。

5:重写使用的频率比较高,实现多态;覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候。

小拓展:当使用new关键字覆盖一个成员方法或变量时,隐藏的成员在类层次结构中的位置会改变,它会在派生类中被重新定义,而不是从基类中继承。当基类对象引用派生类对象时,派生类中隐藏的成员不被基类引用所包含,因此它们无法访问。而在派生类中,新定义的成员将起作用,完全与基类中的同名成员无关。

标签:Console,C#,重写,子类,override,new,父类,方法
From: https://www.cnblogs.com/letmebaby/p/17261435.html

相关文章

  • ChatGPT接入微信 C#完整源码
    1.无需搭建服务器2.winform运行程序扫码登录,就可以充当机器人调用chatGPT可实现自动回复(可以识别会话消息和群聊消息,拉入群聊@机器人可以进行群聊的消息回复),可以申请小......
  • 用netty实现dubboRPC
    Dubbo是一种基于Java的高性能RPC框架,使用Netty作为底层网络通信库。下面是使用Netty实现DubboRPC的示例代码:服务端代码:publicclassDubboRpcServer{privatefina......
  • 如何使用 CAA 记录防止错误签发 SSL 证书?
    什么是CAA?CAA(CertificationAuthorityAuthorization,证书颁发机构授权)是一项降低SSL证书错误颁发的控制措施,由互联网工程任务组(IETF)批准列为IETFRFC6844规范。2017......
  • ASEMI代理NXP汽车芯片MCIMX7D5EVM10SD
    编辑-ZMCIMX7D5EVM10SD系列处理器代表了恩智浦在满足低功耗需求的高性能处理和高度功能集成方面的最新成就。这些处理器的目标是不断增长的联网和便携式设备市场。 MCI......
  • ASEMI代理NXP汽车芯片MC34PF3001A7EP
    编辑-Z用于i.MX7和i.MX6SoloLite/SoloX/UltraLite处理器的电源管理集成电路(PMIC) MC34PF3001A7EP是一款SMARTMOS电源管理集成电路(PMIC),专为使用NXPi.MX7和i.MX6So......
  • rocketmq 报错ERROR: Please set the JAVA_HOME variable in your environment, We ne
    以下命令全部按顺序执行unlink/usr/bin/javacunlink/usr/bin/jarunlink/bin/java ln-s/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64/bin/j......
  • Nginx 重写功能(location / rewrite)
     一、Nginx常见模块httphttp块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这模块中。作用包括:文件引入......
  • centos添加永久静态路由
    CentOS7系统双网卡环境下添加静态路由的几种方法发布于2019-11-2111:11:44阅读 9.4K0 如下拓扑图所示(点击图片查看清晰大图)场景简单描述一下:CentOS7......
  • 【THM】Packets & Frames(了解数据包和帧)-学习
    本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/packetsframes本文相关内容:了解数据如何被分成更小的部分并通过网络传输到另一台设备。什么是数据包和帧?......
  • KPCA matlab代码,可分train和test。 注释清晰
    KPCAmatlab代码,可分train和test。注释清晰YID:7220647215929418......