浅谈C#中virtual和abstract的区别
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的区别相关推荐
- 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣.
- html代码id,浅谈html中id和name的区别实例代码
浅谈html中id和name的区别实例代码 更新时间:2008年07月28日 23:00:55 作者: 这个是form里面的name与id的区别 我们可以通过一段代码来分析一下其中的微妙差别: 在 ...
- 【网摘】 浅谈HTTP中GET与POST的区别
文章出处:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html 浅谈HTTP中Get与Post的区别 Http定义了与服务器交互的不 ...
- 浅谈ajax中get与post的区别,以及ajax中的乱码问题的解决方法
一.谈Ajax的Get和Post的区别 Get方式: 用get方式可传送简单数据,但大小一般限制在1KB下,数据追加到url中发送(http的header传送),也就是说,浏览器将各个表单字段元素及 ...
- 浅谈HTTP中Get与Post的区别_转
可参考:HTTP请求中POST与GET的区别 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个UR ...
- 浅谈C#中的抽象类(abstract)和接口(interface)
很多C#的初学者在编程时都容易把抽象类和接口搞混,甚至很多编程老鸟也没有弄明白为什么有了抽象类又搞个接口(这里也包括了本老鸟).所以这里整理了C#抽象类和接口的区别,详细的分析了抽象类与接口的概念与特 ...
- 浅谈java中extends与implements的区别
Extends可以理解为全盘继承了父类的功能.implements可以理解为为这个类附加一些额外的功能:interface定义一些方法,并没有实现,需要implements来实现才可用.extend可 ...
- 浅谈MySQL中utf8和utf8mb4的区别
一.什么是UTF8MB4? 我们在使用PhpMyAdmin管理面板时,可以在首页看到名为"Server connection collation"(服务器连接排序规则)的选项,用来 ...
- 浅谈HTTP中Get与Post的区别
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...
最新文章
- java中rs怎么用_java-如何使用JAX-RS设置字符集?
- 免费网络学术资源获取
- Xshell操控kali-linux虚拟机
- python图形绘制库turtle中文开发文档及示例大全【最详细、连结果图都有,gif格式的!】
- 傲梦python笔试题_python笔试题
- 【算法】LeetCode算法题-Remove Duplicates from Sorted Array
- django select option拼接时value中空格后的内容被截断
- [转]C#网络编程(同步传输字符串) - Part.2
- 医疗数据治理——构建高质量医疗大数据智能分析数据基础
- vs2017 html安装,解决vs2017无法安装问题
- 4大MQ消息队列的比较
- goroutine并发扫描MySQL表_【扫描全能王】【干货】Goroutine Channel
- 光纤跳线接口_如何为10G SFP+光模块搭配对应的光纤跳线类型?
- 现实世界的补丁长什么样? [ICSME 18] A Closer Look at Real-World Patches (结尾附论文阅读反思)
- Android软件TOP10排行榜
- javaSE探赜索隐四<数组>
- Docker 从入门到实践系列一 - 什么是Docker
- 如何学习编程语言_如何学习编程
- asp.net58同城简单登陆
- 性能测试报告模板 V1.0
热门文章
- 吴恩达神经网络和深度学习-学习笔记-11-Momentum梯度下降法
- js系列教程11-json、ajax(XMLHttpRequest)、comet、SSE、WebSocket全解
- AD19一键同时修改PCB各元器件黄色标志字符的尺寸(大了太占空间改小一点
- IDEA的Maxcomputer Studio开发
- 第6次结对作业--郑锦伟古维城
- 【Xamarin挖墙脚系列:Xamarin的核心】
- [转载] python+selenium自动化软件测试(第3章):unittes
- linux中$@,$*,$0,$$,$?参数的含义
- RPC 框架之 Goole protobuf
- Eclipse------新建文件时没有JSP File解决方法