温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#中重写及覆盖的区别有哪些

发布时间:2023-03-28 11:57:49 来源:亿速云 阅读:288 作者:iii 栏目:开发技术

这篇文章主要介绍了C#中重写及覆盖的区别有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中重写及覆盖的区别有哪些文章都会有所收获,下面我们一起来看看吧。

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中的覆盖方法:我是父类中的虚拟方法

关于“C#中重写及覆盖的区别有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C#中重写及覆盖的区别有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI