• 接口
     接口是一组抽象成员的集合,表示某个类或结构可以选择去实现的行为,描述的是可属于任何类或结构的一组相关功能。接口方法的实现是在实现接口的类中完成的,实现接口的类可以显式实现该接口的成员,显式实现的成员不能通过类实例访问,而只能通过接口实例访问。接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型。 它不能包含静态成员。 接口成员是自动公开的,且不能包含任何访问修饰符。
  • 关键字
    • interface
  • 可包含成员
    • 方法
    • 属性
    • 索引器
    • 事件
  • 备注
    • 接口类似于抽象基类:实现接口的任何非抽象类型都必须实现接口的所有成员。
    • 不能直接实例化接口。
    • 接口不包含方法的实现。
    • 类和结构可继承多个接口,但继承的基类必须放在第一位,之后才是继承的接口。
    • 接口自身可从多个接口继承。
    • 接口可以作为参数传递实现该接口的类型
    • 接口可以作为返回值传递实现该接口的类型
    • 接口类型数组可以存放实现同一接口的不同类型
  • 显式接口实现
     如果类实现两个接口,并且这两个接口包含具有相同签名的成员,那么在类中实现该成员将导致两个接口都使用该成员作为它们的实现。
interface IControl
{
void Paint();
}
interface ISurface
{
void Paint();
}
class SampleClass : IControl, ISurface
{
// 2个接口都需要实现的方法
public void Paint()
{
}
}
     然而,如果两个接口成员执行不同的函数,那么这可能会导致其中一个接口的实现不正确或两个接口的实现都不正确。可以显式地实现接口成员 -- 即创建一个仅通过该接口调用并且特定于该接口的类成员。这是使用接口名称和一个句点命名该类成员来实现的。
public class SampleClass : IControl, ISurface
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}
     类成员 IControl.Paint 只能通过 IControl 接口使用,ISurface.Paint 只能通过 ISurface 使用。两个方法实现都是分离的,都不可以直接在类中使用。
SampleClass obj = new SampleClass();
IControl c = (IControl)obj;
c.Paint();
ISurface s = (ISurface)obj;
s.Paint();
     显式实现还用于解决两个接口分别声明具有相同名称的不同成员(如属性和方法)的情况。为了同时实现两个接口,类必须对属性 P 和/或方法 P 使用显式实现以避免编译器错误。
interface ILeft
{
int P { get;}
}
interface IRight
{
int P();
}

class Middle : ILeft, IRight
{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}
  • 判断类型是否支持指定接口
    • try/catch

类型强制转换为指定接口,如果类型不支持被请求的接口,将会收到一个无效转换异常InvalidCastException。

    • as

使用as关键字将类型指定为接口,获得指向对象接口的引用,如果不支持该接口则获得一个值为null的空引用。

    • is
     使用is关键字检查类型是否实现该接口,如果类型不支持该接口则返回false,如果支持该接口则返回true。

  • 构建可枚举类型
     如果类型需要实现可枚举的功能需要继承自IEnumerable或IEnumerator接口。
    • 实现接口

      • IEnumerable
      • IEnumerator
  • 构建可克隆的对象
     如果类型需要实现可克隆的功能需要继承自ICloneable接口。
    • 实现接口

      • ICloneable
  • 构建可比较的对象
     如果类型需要实现可比较的功能需要继承自IComparable接口。
    • 实现接口

      • IComparable

.NET 接口的更多相关文章

  1. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  2. 干货来袭-整套完整安全的API接口解决方案

    在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...

  3. 12306官方火车票Api接口

    2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...

  4. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  6. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

  7. 【WCF】自定义错误处理(IErrorHandler接口的用法)

    当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...

  8. PHP以接口方式实现多重继承(完全模拟)--学习笔记

     1.UML类图: 2.PHP代码: <?php /** * Created by PhpStorm. * User: andy * Date: 16-11-23 * Time: 下午7:57 ...

  9. 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo

    Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...

  10. 【接口开发】浅谈 SOAP Webserver 与 Restful Webserver 区别

    接口,强大,简单,交互,跨越平台 下面简单阐述这两大接口思想 一 REST: REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. ...

随机推荐

  1. HttpUtility.UrlEncode 和Server.UrlEncode的区别,记录记录,被乱码搞晕头了。。。。。

    今天修改原来的站点,有几个session和cookies乱码问题,然后又好好看了一下关于编码这块的内容. 大概是:登录处,用session记录了一点中文内容.然后cookies也记录了一点中文内容,取 ...

  2. phpstorm 激活服务器

    phpstorm 激活服务器 http://jetbrains.tencent.click/ (2016-09-19 可用) webstorm 激活服务器 http://owo.help(2016-0 ...

  3. js 获取时间间隔

    现在感觉sublime   IDE 用着比较方便,也比较美观,不知道大家用的是啥ide.

  4. 85 megacli-查看raid信息

    文章本身我不做过多修改了,在这里我就把自己在安装时候碰到的难点跟大家提下.1.何处下载?首先,根据文章中的路径已经下载不到相应的文件了,在此我们就自己到http://www.lsi.com的网站上去搜 ...

  5. time & datetime

    时间相关的操作,时间有三种表示方式: 时间戳               1970年1月1日之后的秒,即:time.time() 格式化的字符串    2014-11-11 11:11,    即:t ...

  6. hdu3087 LCA + 暴力

    Network Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...

  7. ORB-SLAM(四)追踪

    最近在读ORB-SLAM的代码,虽然代码注释算比较多了,但各种类和变量互相引用,看起来有点痛苦.索性总结了一下Tracking部分的代码结构,希望能抓住主要思路,不掉坑里. 追踪 追踪部分的主要思路是 ...

  8. linux/ubuntu查看内核版本命令

    打开终端,输入: uname -a

  9. Pycharm 输出中文或打印中文乱码现象的解决办法

    1. 确保文件开头加上以下代码: # -*- coding:utf-8 -*- 还可以加上 import sys reload(sys) sys.setdefaultencoding('utf-8') ...

  10. 面试web前端开发,被打击了

    今天我去面试web前端开发,被打击了,也跟我也有一定的关系,最基础的东西我都没回答好,哎! 主要是我在等我有意向的公司给我发offer,闲着没事,刚好又有公司叫我去面试,我抱着多面一家也没有啥子坏处就 ...