c#接口容易被忽视的问题
今天在看“并发集合”的时候,接口IProducerConsumerCollection<T> 有一个方法是TryAdd(),表示“试图”去添加,然后ConcurrentQueue<T> 这个类继承了该接口,
根据我以前对接口的理解就是,ConcurrentQueue<T>这个类必须要实现TryAdd()方法才行。然后事实上,通过ConcurrentQueue<T>类的实力对象,根本点不出TryAdd方法

但是msdn上面对于ConcurrentQueue<T>类的说明,却明确说明了“显示实现”TryAdd接口方法。如果说实现了那为什么ConcurrentQueue<T>实例对象为什么点不出来TryAdd方法呢? 我搞不懂!后来问了一下人,他说“你去看看显示实现跟隐式实相关的资料”
诶,以前真没去关心,原来接口还分显示跟隐式。
一、接口的显示实现与隐式实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 显示接口隐式接口
{
class Program
{
static void Main(string[] args)
{
myImplicitClass iClass = new myImplicitClass();
iClass.myMethon(); myExplicitClass eClass = new myExplicitClass();
//类型转换成接口
(eClass as myInterface).myMethon();
}
} interface myInterface
{
void myMethon();
} public class myImplicitClass : myInterface
{
/// <summary>
/// 传统模式就是这种隐式模式来实现接口方法的
/// </summary>
public void myMethon()
{
Console.WriteLine("传统的隐式实现接口方法");
}
} public class myExplicitClass : myInterface
{
/// <summary>
/// 必须显示实现接口 接口名称.方法名 的方式来调用方法
/// </summary>
void myInterface.myMethon()
{
Console.WriteLine("显示实现接口方法");
}
}
}
执行结果是:

那问题又来了,既然有隐式实现(默认实现方式)那还要显示干嘛?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 显示调用接口Demo
{
class Program
{
static void Main(string[] args)
{
MyClass c = new MyClass();
int i = c.Add();
Console.WriteLine(i);
}
} interface addInterface
{
int Add(int i);
} class BaseClass
{
public int Add(int i)
{
return i + ;
}
} class MyClass :BaseClass, addInterface
{ }
}
二、接口的显示实现的意义
像这样的一个程序接口addInterface1有一个Add方法,如果子类MyClass的没有去实现Add方法的话,其实也是可以正常运行的,因为基类实现了Add方法。
那如果说,现在子类也实现了Add方法的话会怎样?

添加了new 关键字就会覆盖基类的Add方法,那有没有一种方法既可以在子类中实现一个Add方法,又不会覆盖基类的Add方法呢?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 显示调用接口Demo
{
class Program
{
static void Main(string[] args)
{
MyClass c = new MyClass(); int i = c.Add();
Console.WriteLine("调用基类的Add方法结果是:"+i); i = ((addInterface)c).Add();
Console.WriteLine("显示调用接口的Add方法结果是:" + i);
}
} interface addInterface
{
int Add(int i);
} class BaseClass
{
public int Add(int i)
{
return i + ;
}
} class MyClass :BaseClass, addInterface
{
int addInterface.Add(int i)
{
return i + i;
}
}
}
执行结果是:

c#接口容易被忽视的问题的更多相关文章
- SAP升级ECC6.0 引起的一个事故
上个月底,公司的SAP系统升级到了ECC6,在升级时,我们进行了所有关联系统的集成测试,当时没有发现什么问题. 过了2周,需要从SAP下载对账单了,这个时候问题出现了,很多分公司的数据下载失败.和SA ...
- .NET框架设计(常被忽视的C#设计技巧)
阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...
- usb驱动开发24之接口驱动
从第一节我们已经知道,usb_generic_driver在自己的生命线里,以一己之力将设备的各个接口送给了linux的设备模型,让usb总线的match函数,也就是usb_device_match, ...
- Jenkins+Jmeter+Ant接口持续集成
修改时间 修改内容 修改人 2016.5.22 创建 刘永志 2016.6.15 完成 刘永志 前言: 为什么要用Jmeter做接口测试: 当选择这套方案的时候,很多人会问,为什么选择Jmeter做C ...
- .NET框架设计(常被忽视的框架设计技巧)
阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...
- Jenkins+Jmeter+Ant 接口持续集成(转)
来源:https://testerhome.com/topics/5186 为什么要用Jmeter做接口测试 当选择这套方案的时候,很多人会问,为什么选择Jmeter做Case管理?为什么不自己写框架 ...
- Blackfin DSP(六):BF533的SPORT接口
1.特性 bf533有两个SPORT口(synchronous serial Port),即同步串行接口.完全独立的接收和发送通道,且每个通道都具有缓冲,最高速度可达SCLK/2.最大支持32bit字 ...
- RESTFUL接口
原文地址:http://kb.cnblogs.com/page/512047/ 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者 ...
- 重构9-Extract Interface(提取接口)
我们来介绍一个常常被忽视的重构:提取接口.如果你发现多于一个类使用另外一个类的某些方法,引入接口解除这种依赖往往十分有用.该重构实现起来非常简单,并且能够享受到松耦合带来的好处. public cla ...
随机推荐
- 【python】15个最受欢迎的Python开源框架
Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是其全自动化的管理后台: ...
- PetShop安装失败
报错提示: Security This installer has encountered an unexpected error installing this package. This may ...
- python---IPy
Python第三方模块IPy,可完成高效的IP规划工作 #安装 #pip3 install IPy #最新版本V0.83 IP地址 网段的基本处理 >>>from IPy impor ...
- git学习2:版本库
创建版本库 版本库,又称仓库,英文名为repository,版本库内的所有文件都可以被Git管理起来,即每个文件的修改.删除,Git都能跟踪. 1,在目录中创建版本库 在目录中有两种创建版本库的方法, ...
- php类中常量的定义
先看下面一段代码: class SVN { const DEFAULT_PATH = "/tmp"; const SVNLOOK_CMD = "/usr/bin/svnl ...
- Windows服务器上使用bat定时执行php
windows上和linux上有一个类似的cmd和bat文件,bat文件类似于shell文件,执行这个bat文件,就相当于依次执行里面的命令(当然,还可以通过逻辑来实现编程),所以,我们可以利用bat ...
- Dimmer: 通过移动鼠标来改变 LED 的亮度
原文地址 - https://www.arduino.cc/en/Tutorial/Dimmer 调光器 本例展示了如何通过个人电脑发送数据到 Arduino / Genuino 开发板来控制一个LE ...
- ArcGIS Engine中数据的加载 (转)
1.加载Shapefile数据 1 IWorkspaceFactory pWorkspaceFactory; 2 IFeatureWorkspace pFeatureWorkspace; 3 IFea ...
- XF 文档 - Element Framework Doc
配置篇 Chapter Configuration Schema篇 Chapter Schema 查询篇 Chapter Querying Data 数据更改及验证篇 Chapter Data Mod ...
- adcfgclone.pl appsTier报错Unable to locate 'linkxlC' utility in path
$ cd /u01/dev/apps/apps_st/comn/clone/bin$ perl adcfgclone.pl appsTier Copyrigh ...