C#.NET 虚方法中中的virtual 和override关键字的使用
谈到C#.NET的虚方法就不得不先说一下继承性(inheritance),继承和多态度、封装一起构成面向对象程序设计的三大要素,继承指一个类基于一个已有的类按照需求添加和删除一些功能.
首先,我们通过下面一个例子来了解一下virtual 和override关键字的作用.
class CA
{
public void Foo()
{
Console.WriteLine("CA.Foo");
}
}
class CB : CA
{
public void Foo()
{
Console.WriteLine("CB.Foo");
}
}
class Test
{
public static void InvokeFoo(CA ca)
{
ca.Foo();
}
public static void Main()
{
InvokeFoo(new CB());
}
}
我们先试着猜想一下输出的结果应该为什么,从逻辑上说作者想要得到的应该是输出:CB.Foo.但我们执行一次很容易的发现结果是CA.Foo.这是怎么回事呢.我们的CB类不是已经继承了CA类吗,而我们的InvokeFoo方法不是也已经创建了一个新的CB对象吗?怎么最后的结果却是CA.Foo.
因为在调用InvokeFoo()的时候,CB被转换成CA,所以执行ca.Foo的时候,仍然调用的是CA的Foo。
那怎样才能让这段代码按作者的意图输出CB.Foo了?我们再来看看下面的这段代码,注意它与上面代码的不同之处:
class CA
{
public virtual void Foo()
{
Console.WriteLine("CA.Foo");
}
}
class CB : CA
{
public override void Foo()
{
Console.WriteLine("CB.Foo");
}
}
class Test
{
public static void InvokeFoo(CA ca)
{
ca.Foo();
}
public static void Main()
{
InvokeFoo(new CB());
}
}
输出结果:CB.Foo
可能大家已经注意到了,我们在基类CA的Foo()方法前使用了virtual关键字体,在子类CB的Foo()方法前使用了override关键字.恰恰就是这两个关键字帮助我们实现了我们的想法.那他们究竟又做了些什么呢?原来virtual关键字告诉编译器,当前Foo()方法需要运行时才进行绑定,而override关键字告诉编译器它后面的Foo()方法将要覆盖基类中的Foo()方法.因此尽管在调用InvokeFoo()的时候,CB被转换成CA,但是当执行ca.Foo的时候,仍然调用了CB的Foo。因为ca此时指向的是一个CB类型的对象
C#.NET 虚方法中中的virtual 和override关键字的使用相关推荐
- C#~虚方法,虚方法和抽象方法的区别
虚方法 特点: <1>虚方法必须使用virtual修饰 <2>虚方法同抽象方法(adstract)一样使用override关键字重写 <3>虚方法在子类中可以实现, ...
- C#中虚方法(virtual)详解
前言;在前面的博客重写中提到了虚方法和抽象类,本博文详细介绍下虚方法: 目录: 一.虚方法的定义: 二.虚方法的声明: 三.虚方法的调用: 四.虚方法的规则: 五.虚方法注意事项: 六.虚方法的好处: ...
- 虚方法调用在Java虚拟机中的实现方式?
写在前面 本文隶属于专栏<100个问题搞定Java虚拟机>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java ...
- 关于C#中虚方法重载的说明
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 首先请大家看看下面的例子 ...
- C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载
C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载 using System; using System.Collections.Generic; using Sys ...
- @data 重写set方法_C#中的类、方法和属性
这节讲C#中的类,方法,属性.这是面向对象编程中,我们最直接打交道的三个结构. 类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字 ...
- c#中abstract与virtual的区别
1.abstract方法只能在抽象类中声明,虚方法则不是. abstract方法必须在派生类中重写,而virtual则不必 2.abstract方法不能声明方法实体, abstrac ...
- C#中Abstract和Virtual的区别
转自原文 C#中Abstract和Virtual的区别 c# 中 Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用.下面讨论一下二者的区别: 一.Virtua ...
- C# 子类实例化基类 基类使用不了子类的方法_C#中的类、方法和属性
这节讲C#中的类,方法,属性.这是面向对象编程中,我们最直接打交道的三个结构. 类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字 ...
最新文章
- kvm cpu的亲和性绑定配置
- 解析网站发布系统利用ASP生成静态页面的方法
- 差分约束 1:pku 1201 Intervals 2:pku 1364 King 3:hdu 1534
- 分布式事务:两段式提交(最终一致性)
- 当分区数量与reducer task数量不一致时,会怎么样。
- 1097 Deduplication on a Linked List (25 分)_35行代码AC
- WIN7部分程序中文乱码的简单解决方法
- 全球约39亿人未接入互联网 韩国家庭宽带普及率最高
- 博弈-巴什博奕-P/N图
- csv解析java_Java CSV解析器
- linux的文件permission需要设置,否则会使用as3的urlrequest失败
- 【WIN10】清除图标缓存
- 面试题:Elasticsearch和solr的区别
- 关于安装VS2005后‘找不到visual studio模板信息’的解决方法
- android 计时器工具类,Android实现计时器功能
- Java 操作 word 文档 (二)初识 WordprocessingML 标签
- 在Vue项目中使用LayUI教程且解决laydate无效的问题
- Centos7下areaDetector IOC的编译后记
- Leetcode 971 C++代码
- 虚继承是什么意思_程序猿是什么意思?程序员为什么叫程序猿?程序猿笑话段子-360常识网...