C#面向对象基础:virtual方法,abstract方法,区别
virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。默认情况下,类中的方法是非虚的,非虚的方法不能在子类中被覆盖(override),但是可以隐藏(new),但这不影响父类方法的功能。为了达到子类以自己的方法实现某一功能的目的,需要在父类中用virtual关键字来修饰方法,这样,在其继承子类中就可以采用覆盖的方法来提供方法的多态机制。virtual关键字在类中修饰方法需要注意以下几点:
1. virtual修饰类中方法时,前面必须有public修饰符,非虚方法不能是有;
2. virtual不可以与static、abstract、private、override一起使用;但virtual和override密不可分,要在子类中覆盖基类的虚方法,就必须要用到override覆盖,以子类方法实现某一功能;
3. virtual修饰的方法必须有实现,即使该实现是一个空方法体;
4. 基类中的virtual方法可以选择在继承子类中覆盖或不覆盖,这样就存在两种情况:
(1)若基类中定义的virtual方法在派生类中被覆盖(override),那么在对派生类实例的调用中,该方法使用的是派生类中的新方法(该新方法是在子类中通过覆盖父类中的虚方法而重新定义的方法);
(2)若在基类中定义的virtual方法在派生类中没有被覆盖(override),那么在对派生类实例的调用中,该方法使用的是基类中定义的方法。
5. 如果基类中的方法准备在派生类中覆盖(override),那么基类中的该方法必须要用virtual修饰。
abstract(抽象)方法在逻辑上类似于virtual(虚)方法,只是它不能像虚方法那样被调用,它只是一个接口的声明而非实现。在定义abstract(抽象)类和方法时需要注意以下几点:
1. abstract(抽象)方法没有类似于{……}这样的方法实现,也不许允许这样做;
2. 含有abstract(抽象)方法的类一定要是abstract(抽象)类,同时一定要加abstract修饰符;只有抽象类才能有抽象方法;另外,抽象类只能作为基类(父类)使用;
3. 抽象方法在基类中没有具体实现,但必须要在子类中覆盖(override)并实现该方法;并且抽象方法在实现后不能更改修饰符。
4. 如果子类没有实现抽象父类中所有的抽象方法,则子类也必须定义成一个抽象类。
C#面向对象基础:virtual方法,abstract方法,区别的更多相关文章
- C#中virtual与abstract的区别
C#中virtual与abstract的区别 C#的virtual & abstract经常让人混淆,这两个限定词都是为了让子类进行重新定义,覆盖父类的定义.但是用法上差别很大. a) ...
- asp.net中virtual和abstract的区别
这篇文章主要介绍了asp.net中virtual和abstract的区别,较为详细的分析了virtual与abstract的概念与具体用法,并以实例的形式予以总结归纳,需要的朋友可以参考下 本文实例分 ...
- asp.net中virtual和abstract的区别分析
这篇文章主要介绍了asp.net中virtual和abstract的区别,较为详细的分析了virtual与abstract的概念与具体用法,并以实例的形式予以总结归纳,需要的朋友可以参考下 本文实例分 ...
- C#中virtual和abstract的区别
先说区别: virtual意思是虚拟,abstract意思是抽象. virtual只修饰方法,abstract修饰方法和类. virtual方法必须有实现,abstract方法必须没有实现. publ ...
- 【转】C#中virtual和abstract的区别
virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能 ...
- virtual和abstract的区别和联系
壹. 相同 他们有些相似.有些场景用哪个都行! 1. 修饰父类.让子类重写 virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 2. 都用必须public 如 ...
- virtual和abstract的区别
virtual和abstract都是用来修饰父类的,前面不能用private私有,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的. 毕竟加上virtual或abstract就是让子类重新定义 ...
- C#基础--Virtual与abstract区别、重写
Virtual作用:子类可以对父类重写,虚方法是对多态特征体现.代表一类对象的所具有的公共属性或方法. public class Animal { public string Name { get; ...
- c#面向对象基础 重写、虚方法、抽象类
虚方法 抽象类与抽象方法 1.书写规范: 在类前面加上abstract关键字,就成为了抽象类:在一个方法前面加上abstract关键字,就成为了抽象方法(抽象方法不能有实现方法,直接在后面加分号) 例 ...
随机推荐
- ARM中的PC和AXD的PC
R15 (PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令.一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC 总是指向第三条指令 ...
- 加密算法 - RSA算法二
RSA算法原理(二) 声明: 本文转自阮一峰 (http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html) 有了这些知识, ...
- iOS 一些struct类型的NSLog输出格式-b
我们经常会输出一些坐标尺寸信息之类的,比如view的frame,是CGRect类型的,用frame.oringial.x 和frame.size.width来做NSLog参数好麻烦,还好苹果对这些常用 ...
- JS简单仿QQ聊天工具的制作
刚接触JS,对其充满了好奇,利用刚学到的一点知识,写了一个简单的仿QQ聊天的东西,其中还有很多的不足之处,有待慢慢提高. 功能:1.在输入框中输入内容,点击发送,即可在上方显示所输入内容. 2.点击‘ ...
- 理解和熟练运用js中的call及apply
call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向. 因为 JavaScript 的函数存在「定义时上下文」和 ...
- Nexus 7 跳过网络验证
本文从著名安卓论坛 xda-developers 搬运而来,原文链接 http://forum.xda-developers.com/showthread.php?t=1909602 由于众所周知的 ...
- Discuz! 7.2 SQL注入exp
已经有人写出一些工具了,但是感觉不怎么好用,就自己写了个. 参数:1.可直接getshell2.爆管理账号密码3.爆表前缀如果表前缀不是默认的cdb_ 只需更改代码中的 $table即可,方便快捷. ...
- AFN演示
- linux上怎么切换不同版本的arm-linux-gcc?只需改一行函数
linux上怎么切换不同版本的arm-linux-gcc?只需改一行函数 ln -s /usr/local/arm/3.4.1/bin/arm-linux-gcc /usr/bin/arm-linux ...
- JavaScript字符串的操作
<script> var s=new String(); var s="Hello World"; alert(s.toLowerCase(s));//转小写 aler ...