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 ...
随机推荐
- MySQL下载、安装及启动
介绍 Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之 ...
- [原]JQuery mobile CSS 文件组织
从 JQuery mobile 1.4 开始, CSS 由3个部分组成,分别是 Icons.Theme和Structure jquery.mobile-1.4.x.css: 包括了 <标准图标 ...
- 解决HttpWebRequest首次连接特别慢的问题
针对这个问题,网上各种搜,然后看到的解决方案大致相同,改web.config,问题来了,按网上说的,没感觉快了多少 <?xml version="1.0"?> < ...
- Redis应用配置项说明
近期整理了下项目中Redis配置参数,以便学习备用~ #指定内存大小,格式为1k 1GB 1M,单位不区分大小写 # 1k => 1000 bytes # 1kb => 1024 byt ...
- 安装SQL提示重启电脑失败,解决办法
1. 打开注册表, 找到HKEY_LOCAL_MACHINE-->software-->Microsof-->MSSQLServer...统统删掉 2.HKEY_LOCAL_MACH ...
- 25+ Useful Selenium Web driver Code Snippets For GUI Testing Automation
本文总结了使用Selenium Web driver 做页面自动化测试的一些 tips, tricks, snippets. 1. Chrome Driver 如何安装 extensions 两种方式 ...
- Redis(一) 介绍
先说明下,本人是在windows系统下用的. 简单介绍一下,是nosql数据库,采用key-value存储方式形式.可用于处理高并发日志.维护top表等. 如果把它完全当初数据库使用,当做小型数据库还 ...
- Android Studio in OSX 提高工作效率的快捷键
前言 本篇文章参考了<倍数提高工作效率的Android Studio>一文,快捷键基于OS X系统. OS X Yosemite 10.10.5 Android Studio 1.3.1 ...
- SIP 解析
1 general-header类: 为描述消息基本属性的通用头域,可用于请求消息或响应消息:通用头域的域名只有在协议版本改变时才可有效地扩展.不过,通信中的所有方均认为是“通用头域”的新的头域也可认 ...
- extends 和 implements
extends是继承类与类的 implements是实现接口的 类与类之间只支持单继承 接口与接口之间支持多继承