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

 更新时间:2023年03月28日 10:38:56   作者:letmebaby  
这篇文章主要为大家详细介绍了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关键字覆盖一个成员方法或变量时,隐藏的成员在类层次结构中的位置会改变,它会在派生类中被重新定义,而不是从基类中继承。当基类对象引用派生类对象时,派生类中隐藏的成员不被基类引用所包含,因此它们无法访问。而在派生类中,新定义的成员将起作用,完全与基类中的同名成员无关。

到此这篇关于一文详解C#中重写(override)及覆盖(new)的区别的文章就介绍到这了,更多相关C# 重写 覆盖内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#面向对象之模拟实现商城购物功能

    C#面向对象之模拟实现商城购物功能

    这篇文章主要为大家详细介绍了C#面向对象之模拟实现商城购物功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C# Winform中实现主窗口打开登录窗口关闭的方法

    C# Winform中实现主窗口打开登录窗口关闭的方法

    这篇文章主要介绍了C# Winform中实现主窗口打开登录窗口关闭的方法,这在需要用户名密码的软件项目中是必用的一个技巧,要的朋友可以参考下
    2014-08-08
  • c#之OpenFileDialog解读(打开文件对话框)

    c#之OpenFileDialog解读(打开文件对话框)

    这篇文章主要介绍了c#之OpenFileDialog(打开文件对话框),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Unity实现滑动更换界面效果

    Unity实现滑动更换界面效果

    这篇文章主要为大家详细介绍了Unity实现滑动更换界面效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C#中async和await的深入分析

    C#中async和await的深入分析

    Async/Await是C# 5引入的关键字,用以提高用户界面响应能力和对Web资源的访问能力,同时它使异步代码的编写变得更加容易,下面这篇文章主要给大家介绍了关于C#中async和await的相关资料,需要的朋友可以参考下
    2022-11-11
  • c#生成站点地图(SiteMapPath)文件示例程序

    c#生成站点地图(SiteMapPath)文件示例程序

    这篇文章主要介绍了c#生成站点地图(SiteMapPath)文件的示例,大家参考使用
    2013-11-11
  • c#中设置快捷键

    c#中设置快捷键

    c#中设置快捷键...
    2007-03-03
  • C#对Excel表csv文件的读写操作详解

    C#对Excel表csv文件的读写操作详解

    在C#编程中,CSV(Comma Separated Values)文件是一种常见的数据存储格式,用于存储表格数据,如数据库导出或报表,CSV文件以其简单、易于处理和跨平台兼容性而受到广泛使用,本篇文章将深入探讨如何在C#中进行CSV文件的读写操作,需要的朋友可以参考下
    2024-12-12
  • c#生成自定义图片方法代码实例

    c#生成自定义图片方法代码实例

    在本篇文章中我们给大家分享了关于c#生成自定义图片方法的相关内容,有需要的朋友们可以参考下。
    2018-10-10
  • C# 实现Distinct将对象按条件去重

    C# 实现Distinct将对象按条件去重

    这篇文章主要介绍了C# 实现Distinct将对象按条件去重,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论