virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。

它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的。毕竟加上virtual或abstract就是让子类重新定义的,而private成员是不能被子类访问的。

但是它们的区别很大。(virtual是“虚拟的”,abstract是“抽象的").

(1)virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不能实现。如对于virtual修饰的方法如果没有实现:

        public class Test1{public virtual void fun1();}

错误    2    “Test1.fun1()”必须声明主体,因为它未标记为 abstract、extern 或 partial

对于abstract修饰的方法如果有实现:

        public abstract class Test2{public abstract void fun2() { }}

错误    1    “Test2.fun2()”无法声明主体,因为它标记为 abstract

(2)virtual可以被子类重写,而abstract必须被子类重写,

    class BaseTest1{public virtual void fun() { }//必须有实现}class DeriveTest1:BaseTest1{//public override void fun() { }}

编译不会出现错误,如果重写了virtual修饰的方法,前面必须添加override(这样就告诉了编译器你要重写虚拟方法),而且必须有实现,否则编译出错;

    abstract class BaseTest2{public abstract void fun();}class DeriveTest2 : BaseTest2{//public override void fun();错误1:没有实现//public  void fun() { }  错误2:重写时没有添加override//override void fun() { }错误3:虚拟成员或者抽象成员不能是私有的(只要在父类中声明了虚拟成员或抽象成员,即便是继承的也要加上这个限制)public override void fun() { }//如果重写方法; 错误:“A.DeriveTest2”不实现继承的抽象成员“A.BaseTest2.fun()”    }

(3)如果类成员被abstract修饰,则该类前必须添加abstract,因为只有抽象类才可以有抽象方法。

(4)无法创建abstract类的实例,只能被继承无法实例化,比如:     BaseTest2 base2 = new BaseTest2();将出现编译错误:抽象类或接口不能创建实例。
(5)C#中如果要在子类中重写方法,必须在父类方法前加virtual,在子类方法前添加override,这样就避免了程序员在子类中不小心重写了父类方法。

(6)abstract方法必须重写,virtual方法必须有实现(即便它是在abstract类中定义的方法).

        abstract public class Test{//public virtual void Prinf();错误:virtual方法必须有实现public virtual void Prinf() //abstract类的virtual方法可以不重写;abstract方法必须重写。{Console.WriteLine("Abstract Printf...");}}public class Class1 : Test{/*public override void Prinf() //派生类中不重写abstract类的virtual方法照样可以运行,不过调用派生类对象的Printf方法时,调用的是父类的。{Console.WriteLine("Class One Override Printf...");}*/}

浅谈C#中virtual和abstract的区别相关推荐

  1. 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。

    浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣.

  2. html代码id,浅谈html中id和name的区别实例代码

    浅谈html中id和name的区别实例代码 更新时间:2008年07月28日 23:00:55   作者: 这个是form里面的name与id的区别 我们可以通过一段代码来分析一下其中的微妙差别: 在 ...

  3. 【网摘】 浅谈HTTP中GET与POST的区别

    文章出处:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html 浅谈HTTP中Get与Post的区别 Http定义了与服务器交互的不 ...

  4. 浅谈ajax中get与post的区别,以及ajax中的乱码问题的解决方法

    一.谈Ajax的Get和Post的区别 Get方式: 用get方式可传送简单数据,但大小一般限制在1KB下,数据追加到url中发送(http的header传送),也就是说,浏览器将各个表单字段元素及 ...

  5. 浅谈HTTP中Get与Post的区别_转

    可参考:HTTP请求中POST与GET的区别 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个UR ...

  6. 浅谈C#中的抽象类(abstract)和接口(interface)

    很多C#的初学者在编程时都容易把抽象类和接口搞混,甚至很多编程老鸟也没有弄明白为什么有了抽象类又搞个接口(这里也包括了本老鸟).所以这里整理了C#抽象类和接口的区别,详细的分析了抽象类与接口的概念与特 ...

  7. 浅谈java中extends与implements的区别

    Extends可以理解为全盘继承了父类的功能.implements可以理解为为这个类附加一些额外的功能:interface定义一些方法,并没有实现,需要implements来实现才可用.extend可 ...

  8. 浅谈MySQL中utf8和utf8mb4的区别

    一.什么是UTF8MB4? 我们在使用PhpMyAdmin管理面板时,可以在首页看到名为"Server connection collation"(服务器连接排序规则)的选项,用来 ...

  9. 浅谈HTTP中Get与Post的区别

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...

最新文章

  1. java中rs怎么用_java-如何使用JAX-RS设置字符集?
  2. 免费网络学术资源获取
  3. Xshell操控kali-linux虚拟机
  4. python图形绘制库turtle中文开发文档及示例大全【最详细、连结果图都有,gif格式的!】
  5. 傲梦python笔试题_python笔试题
  6. 【算法】LeetCode算法题-Remove Duplicates from Sorted Array
  7. django select option拼接时value中空格后的内容被截断
  8. [转]C#网络编程(同步传输字符串) - Part.2
  9. 医疗数据治理——构建高质量医疗大数据智能分析数据基础
  10. vs2017 html安装,解决vs2017无法安装问题
  11. 4大MQ消息队列的比较
  12. goroutine并发扫描MySQL表_【扫描全能王】【干货】Goroutine Channel
  13. 光纤跳线接口_如何为10G SFP+光模块搭配对应的光纤跳线类型?
  14. 现实世界的补丁长什么样? [ICSME 18] A Closer Look at Real-World Patches (结尾附论文阅读反思)
  15. Android软件TOP10排行榜
  16. javaSE探赜索隐四<数组>
  17. Docker 从入门到实践系列一 - 什么是Docker
  18. 如何学习编程语言_如何学习编程
  19. asp.net58同城简单登陆
  20. 性能测试报告模板 V1.0

热门文章

  1. 吴恩达神经网络和深度学习-学习笔记-11-Momentum梯度下降法
  2. js系列教程11-json、ajax(XMLHttpRequest)、comet、SSE、WebSocket全解
  3. AD19一键同时修改PCB各元器件黄色标志字符的尺寸(大了太占空间改小一点
  4. IDEA的Maxcomputer Studio开发
  5. 第6次结对作业--郑锦伟古维城
  6. 【Xamarin挖墙脚系列:Xamarin的核心】
  7. [转载] python+selenium自动化软件测试(第3章):unittes
  8. linux中$@,$*,$0,$$,$?参数的含义
  9. RPC 框架之 Goole protobuf
  10. Eclipse------新建文件时没有JSP File解决方法