C#中重写及覆盖的区别有哪些
这篇文章主要介绍了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#中重写及覆盖的区别有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341