小议C#接口的隐式与显示实现
小弟不才,各位大牛嘴下留情。。。
一、对于继承类里头有相同方法时候,用接口方式去调用,会优先查走显式接口方法
例如
public interface IA
{
void Test();
} public class Class1 : IA
{ public void Test()
{
Console.WriteLine("Class1");
} void IA.Test()
{
Console.WriteLine("IA.Test");
}
}
1、接口对象调用方式
IA c1 = new Class1();
c1.Test();
则输出 IA.Test
2、直接调用方式
Class1 c1 = new Class1();
c1.Test();
则输出 Class1
3、推断方式调用 var关键字,编译器自动推断为c1为Class1对象,结果同2
var c1 = new Class1();
c1.Test();
二、多重继承又如何呢?
先看个简单例子
//在上面基础上增加多一个类
public class Class2 : Class1
{
public new void Test()
{
Console.WriteLine("Class2");
}
}
二、以下三种方式调用结果分析得知:接口对象调用方法时候,会去找接口实现接口方法,讲的有点抽象,看一下下面一个小Demo
IA c2 = new Class2();
c2.Test();
输出:IA.Test
Class2 c2 = new Class2();
c2.Test();
var c2 = new Class2();
c2.Test();
输出都是:Class2
三、再来一个比较坑爹例子分析吧
public class Class3 : Class1, IA
{
void Test()
{
Console.WriteLine("Class3");
}
}
当我们写上这段代码,编译会给我一个警告
警告 1 “ConsoleApplication1.Class3.Test()”隐藏了继承的成员“ConsoleApplication1.Class1.Test()”。如果是有意隐藏,请使用关键字 new。 E:\测试Demo代码\接口继承\ConsoleApplication1\ConsoleApplication1\Program.cs 55 14 ConsoleApplication1
从编译器给我提示来看,Test() 并没有实现接口方法
IA c3 = new Class3();
c3.Test();
Class3 c3 = new Class3();
c3.Test();
var c3 = new Class3();
c3.Test();
三种方法结果都是 :IA.Test
如果非得要实现接口方法
只能显示调用,代码改为
public class Class3 : Class1, IA
{
void IA.Test()
{
Console.WriteLine("Class3");
}
}
这样子,这个结果输出毫无疑问是 Class3
总结:接口对象调用方法时候,会去找第一实现接口方法。。。
小议C#接口的隐式与显示实现的更多相关文章
- 小议C#接口的隐式与显示实现(续)
上文连接,讲的比较模糊,而且调用起来感觉比较混乱 http://www.cnblogs.com/walleyekneel/p/3581489.html 这次改为显式接口调用,可能项目也有这个一个需求 ...
- C# 接口的隐式与显示实现
隐式实现的话实现的方法属于实现的类的,可以直接通过类的对象访问,显式实现的话方法是属于接口的,可以看成是寄托在类中实现的,访问这些方法时要先把对象转换成接口对象,然后通过接口对象调用 一般来讲显式实现 ...
- C# 接口的隐式与显示实现【转】
以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习.通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的 ...
- C# 接口的隐式与显示实现及适应场景
通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:“隐式接口实现”.废话不说,例子如下: interface IAnimal { void Dog(); } cla ...
- C# 接口的隐式与显示实现说明
以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习. 通俗的来讲,"显示接口实现"就是使 ...
- C# 使用隐式或显示实现接口的区别
通俗的来讲,"显示接口实现"就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:"隐式接口实现".费话不说,例子如下: interface IA ...
- 转】C#接口-显式接口和隐式接口的实现
[转]C#接口-显式接口和隐式接口的实现 C#中对于接口的实现方式有隐式接口和显式接口两种: 类和接口都能调用到,事实上这就是“隐式接口实现”. 那么“显示接口实现”是神马模样呢? interface ...
- C# interface 的隐式与显示实现及适应范围源码演示
把代码过程中经常用到的一些代码段做个记录,如下的资料是关于C# interface 的隐式与显示实现及适应范围演示的代码. interface IAnimal { void Dog(); } clas ...
- 从头认识java-13.9 隐式和显示的创建类型实例
对于上一章节擦除引起的问题与解决的方法有读者提出过于简单.这里解释一下:由于笔者本身也遇不到对应的问题.仅仅是凭空想像一些有可能的问题,基于水平有限,因此上一章节写的比較简单,欢迎广大读者踊跃提意见, ...
随机推荐
- php curl get post 方法的封装
在开发的时候,需要请求别人的接口,那么就要用到curl了 由于很多地方都会用到,就封装了两个,以后应该都会用到 /* * @desc curl POST 方式请求接口 */ function post ...
- 【原创】 HBase 配置指南
HBase 默认配置 Centos6.5下Hbase配置 官网配置文档:http://hbase.apache.org/book.html#_configuration_files 中文翻译转自: ...
- linux 根据进程名查看其占用的端口
linux 根据进程名查看其占用的端口 pasting $ netstat -nap | grep pid //查看进程ID 所占的端口 netstat -lnp 查看端口所在的进程 will ...
- S3C2440开发环境搭建(Ubuntu)
我的操作系统是 Ubuntu 1404.可以使用下面的命令查看系统的版本: cat /etc/issue 安装.配置.启动 ftp 服务 sudo apt-get install vsftpd 修改 ...
- 网站漏洞扫描并自动化工具-XAttacker
注:该脚本根据网站的cms类型来扫描,所以推荐用来扫外国的站 运行脚本 ┌─[root@sch01ar]─[/sch01ar/XAttacker] └──╼ #perl XAttacker.pl 询问 ...
- ansible命令使用
ansible命令使用 查看每个服务器的主机名 1 $ ansible multi -a "hostname" 使用一个线程执行命令,相当于顺序在每个服务器上运行(默认5个线程执行 ...
- 界面主窗体,子窗体的InitializeComponent(构造函数)、Load事件执行顺序
主窗体,子窗体的InitializeComponent(构造函数).Load事件执行顺序1.执行主窗体定义事件 new函数时,同时执行主窗体构造函数,默认就一个InitializeComponent函 ...
- JDBC概述及连接数据库
一.JDBC简介: JDBC(Java Data Connectivity,java数据库连接)是一种用于执行sql语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写 ...
- MIDL相关
根据MIDL的语义, 指针总被认为是指向单一元素而不是数组.因此以上方法中只有串中的第一个字符被封送.为此,MIDL引入了[string]特性来说明传递的是一个字符串 http://www.cnblo ...
- Hadoop IO基于文件的数据结构详解【列式和行式数据结构的存储策略】
Charles所有关于hadoop的文章参考自hadoop权威指南第四版预览版 大家可以去safari免费阅读其英文预览版.本人也上传了PDF版本在我的资源中可以免费下载,不需要C币,点击这里下载. ...