详解C#用new和override来实现抽象类的重写区别
一,抽象的实现
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Virtualdemo { class Program { static void Main(string[] args) {//BClass A = new BClass(); 抽象类无法被实例 Class1 c = new Class1(); BClass c2 = c; c2.MethodA(); c.MethodA(); c2.MethodB(); c.MethodB(); c2.MethodC(); c.MethodC(); Console.ReadKey(); } } abstract class BClass //抽象类无法被实例 { public virtual void MethodA() { Console.WriteLine("BClassA"); } public virtual void MethodB() { Console.WriteLine("BClassB"); } public virtual void MethodC() { Console.WriteLine("BClassC"); } } class Class1 : BClass { public void MethodA() { Console.WriteLine("MethodA"); }//如果一个虚函数 在子类中没有通过override关键字,那么这个方法就没有被重写,而是被隐藏了 public override void MethodB() { Console.WriteLine("MethodB"); } public override void MethodC() { base.MethodC(); } } }
从上图得出的结果是:
综上:抽象类的虚方法需要被重写,那问题来了重写有两种方式,new和override又有什么区别
二,new和override重写的区别:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Virtualdemo { class Program { static void Main(string[] args) { Teacher t = new Teacher(); Student stu = t; stu.Exam(); stu.Say(); t.Say(); Console.ReadKey(); } } public abstract class Student { public virtual void Exam() { Console.WriteLine("学生都要考试"); } public void Say() { Console.WriteLine("我是学生"); } } public class Teacher : Student { public override void Exam() { Console.WriteLine("老师不用考试"); } //public override void Say() //报错,提示没有virtual,无法被重写 //{ // Console.WriteLine("我是老师"); //} public new void Say() { Console.WriteLine("我是老师"); } } }
结果显示为:
综上总结:
1、如果基类没有定义虚方法,那子类只能使用new,而不能使用override
2、基类有没有定义虚方法,子类都可以使用new
3、子类使用new并不叫重写,而是子类新创建一个方法,只是新创建的这个方法刚好跟基类中的方法同名
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
栏 目:C#教程
下一篇:c# 动态加载dll文件,并实现调用其中的方法(推荐)
本文标题:详解C#用new和override来实现抽象类的重写区别
本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/5911.html
您可能感兴趣的文章
- 01-10C#实现判断当前操作用户管理角色的方法
- 01-10C#使用Dispose模式实现手动对资源的释放
- 01-10C#3.0使用EventLog类写Windows事件日志的方法
- 01-10C#调用dos窗口获取相关信息的方法
- 01-10C#中DataGridView常用操作实例小结
- 01-10C#实现读取被进程占用的文件实现方法
- 01-10C#禁用双击窗体图标关闭窗体的方法
- 01-10C#使用windows服务开启应用程序的方法
- 01-10C#线程队列用法实例分析
- 01-10C#利用反射技术实现去掉按钮选中时的边框效果
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 04-02jquery与jsp,用jquery
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10SublimeText编译C开发环境设置
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结