.Net 填坑 接口、父类、子类同名方法的调用

embedded/2024/9/23 6:30:08/

.Net 填坑 接口、父类、子类同名方法的调用

先看代码

1.类与接口定义

    class B : IDisposable, Test{public void Dispose(){Console.WriteLine("B Dispose");}public virtual void Test(){Console.WriteLine("B Test");}}interface Test{void Test();}class C : B, Test{public new void Test(){Console.WriteLine("C Test");}}

2.调用方法

static void Main(string[] args){Test c = new C();c.Test();c = new B();c.Test();B b = new C();b.Test();Console.ReadLine();}

输出如下:

C Test
B Test
B Test

1.其中第一输出,表示用接口类变量来调用方法时,(类似虚方法调用),会找到变量对应的实际实例(此例子中是类型C的实例对象c),找到实例的类型对象(C类型)的Test方法。
2.第二个输出,同一个原则,实际类型是B类型,所以输出B
3.按照虚方法定义,也应该找到对应实际类型的Test方法来输出,但是输出的是B。原因在于C方法中的New关键字,表示是C类型独有的新的方法,而不是真正的C中的重写父类B中的方法,所以流程是:先找到C类型对象,查找虚方法Test,结果是没找到,然后再去B类中找,找到了,调用B类中的方法。

对应的I代码:

IL_0007: ldloc.0      // cIL_0008: callvirt     instance void Program/Test::Test()IL_000d: nopIL_0014: ldloc.0      // cIL_0015: callvirt     instance void Program/Test::Test()IL_001a: nopIL_0021: ldloc.1      // bIL_0022: callvirt     instance void Program/B::Test()IL_0027: nop

可以看到,接口变量调用方法也是虚方法调用的方式

1.将C中的New 改为override后

结果:

C Test
B Test
C Test

第3个流程发生变化,此时C中Test认为是复写了父类B中的虚方法,所以按虚方法的流程,找到实际对象中C的方法进行了调用。

2.去掉C中继承的Test接口

class C : B{public override void Test(){Console.WriteLine("C Test");}}

打印结果:与上面相同,都是走的虚方法调用

3.去掉C中的Test接口,同时修改C中方法为New

    class C : B{public new void Test(){Console.WriteLine("C Test");}}

结果:

B Test
B Test
B Test

此时C中的Test方法,认为是新的只属于C的方法。
1.第一个变为打印B,因为接口走的虚方法调用的原理,去找实际类型C中有没有覆盖的Test方法,没找到(因为New关键字表示C独有的新的方法),然后找到父类B中的虚方法去调用。
2.第2个,找到实例对象B的虚方法,找到了,直接调用
3.第3个,还是B,因为用虚方法调用,去找C中的复写Test虚方法,没找到,从而去找父类B中的,流程与1相同

总结

方法调用,要看调用方法的方式,实例方法与虚方法。
实例方法,直接按变量类型,去找到对应的方法直接调用
实例虚方法,找到变量实际的存储类型,去一层层找到有无复写的虚方法
注意:new与override关键字的区别,特别是new关键字,可以当做是独立的属于类型自身的方法。


http://www.ppmy.cn/embedded/95982.html

相关文章

SpringBoot-03-整合Redis

文章目录 1.创建S2.配置yml文件3.创建RedisConfig4.编写test类 我是小周,一个怀揣梦想的年轻人,希望我的文章对你的学习能够有启发 用Java来操作Redis。 Jedis和Lettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis…

4G模块DX-CT511CT511N的使用说明

DX-CT511&CT511N买了一个,测试MQTT连接: 方法如下: 1.串口UART_波特率115200连接 2.配置APN: ATQICSGP1,1,“cmnbiot”,“”,“” 注意后面需要有个回车符,不然数据没有完成的 如果成功,回复OK 3.开启…

《乳腺密度高的女性中,使用AI辅助的乳腺X线筛查与补充筛查超声的比较研究》| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Screening Outcomes of Mammography with AI in Dense Breasts: A Comparative Study with Supplemental Screening US 《乳腺密度高的女性中,使用AI辅助的乳腺X线筛查与补充筛查超声的比较研究》 Background 背景 Comparative performance between…

应急响应:Linux 入侵排查思路.

什么是应急响应. 一个组织为了 应对 各种网络安全 意外事件 的发生 所做的准备 以及在 事件发生后 所采取的措施 。说白了就是别人攻击你了,你怎么把这个攻击还原,看看别人是怎么攻击的,然后你如何去处理,这就是应急响应。 目录&…

如何使用 Go 连接 MO

MatrixOne 是一款超融合异构分布式数据库,与 MySQL 高度兼容,通过云原生化和存储、计算、事务分离的架构构建 HSTAP 超融合数据引擎,实现单一数据库系统支持 OLTP、OLAP、流计算等多种业务负载,通过为用户提供一站式超融合数据解决…

java+springboot实现定时任务

由于是初级程序员,基于注解的形式实现了一个简单的定时任务; 1. 使用Scheduled注解 Spring的Scheduled注解是一种非常简单和便捷的实现定时任务的方式。通过在方法上添加Scheduled注解,我们可以指定方法在特定的时间间隔或固定的时间点执行…

第五天:java网络编程、JDBC与高级特性概览

第五天:java网络编程、JDBC与高级特性概览 1. 网络编程基础 Socket编程:学习Java中的Socket编程,理解客户端和服务器端的通信模型。掌握ServerSocket类和Socket类的使用,能够编写简单的TCP客户端和服务器程序。URL与URLConnecti…

一款手机壳凭什么卖800元?Casetify品牌策略全解析 | 品牌出海

Casetify官网 巴黎奥运会,张怡宁的手机壳火了。 张怡宁在现场观战并使用手机的照片在网上流传,不是因为这位奥运前冠军,而是她的手机壳。这款满是「花花绿绿」图案的手机壳,迅速被网友发掘出是Casetify品牌的名为「炫彩花卉」的…