接口的出现,是为了解决C#中不允许多重继承的问题。

1、什么是接口?

我觉得可以把接口理解为对一组方法声明进行的统一命名,但这些方法没有提供任何实现。

通过接口,就可以对方法进行统一管理,避免了在每种类型中重复定义这些方法。

2、如何使用接口来编程

2.1 接口的定义

interface ICustomCompare

{

  //定义比较方法,继承该接口的类都要实现该方法

  int CompareTo(object other);

}

在接口中定义方法不能添加任何访问修饰符,因为接口中的方法默认是public,如果显示地指定了修饰符,则会出现编译时错误。也不能使用static关键字进行修饰。

在接口中除了可以定义方法外,还可以包含属性、事件、索引器,或者这4类成员(包括方法)类型的任意组合;但接口类型不能包含字段、运算符重载、实例构造函数和析构函数。

2.2 继承接口

public class Person:ICustomCompare

{

  int age;

  public int Age{get{return age;} set{age=value;}}

  //实现接口方法

  public int CompareTo(object value)

  {

    if(value==null)

    {

      return 1;  

    }

    //将Object类型强制转换为Person类型

    Person otherp=(Person)value;

    //把当前对象的Age属性与需要比较的对象的Age属性进行对比

    if(this.Age<otherp.Age)

    {

      return -1;

    }  

    if(this.Age>otherp.Age)

    {

      return 1;

    }

    return 0;  

  }

}

在上面的的Person类中,实现了ICustomCompare接口中的CompareTo方法。

CompareTo方法会首先判断参数对象是否为null,如果为null,则直接返回1,代表当前对象比传入对象大。

如果对象不为空的话,强制转换成Person类型,对Age属性进行对比,当前对象的Age属性值比传入对象的Age属性值大,则返回1,如果返回-1,则说明当前对象的Age属性比传入的对象小。

2.3 调用接口中的方法

class Program

{

  static void Main(string[] args)

  {

    Person p1=new Person();

    p1.Age=18;

    Person p2=new Person();

    p2.Age=19;

    //调用接口中方法,对p1和p2进行比较

    if(p1.CompareTo(p2)>0)

    {

      Console.WriteLine("p1比p2大");

    }

    else if(p1.CompareTo(p2)<0)

    {

      Console.WriteLine("p1比p2小");

    }

    else

    {

      Console.WriteLine("p1比p2一样大");

    }

    Console.ReadKey();

  }

}

3、显示接口实现方法

在上面的示例代码当中,使用了隐式的接口实现方式,即在实现代码中没有指定实现哪个接口中的CompareTo方法。

当然,也存在显式的接口实现方式,在类实现接口的过程中,明确指出实现哪一个接口中的哪一个方法。

interface IChineseGreeting

{

  //方法声明

  void SayHello();

}

interface IAmericanGreeting

{

  //方法声明

  void SayHello();

}

//Speaker类实现了两个接口

public class Speaker:IChineseGreeting,IAmericanGreeting

{

  //隐式接口实现

  public void SayHello()

  {

    Console.WriteLine("你好");

  }

}

上面的Speaker类实现了两个接口,碰巧两个接口中声明的方法具有相同的返回类型、相同的方法名称和相同的参数。若采用隐式的接口实现方式,下面的代码将调用相同的SayHello方法。

static void Main(string[] args)

{

  Speaker speaker=new Speaker();

  //调用中国人打招呼方法

  IChineseGreeting chinese=(IChineseGreeting)speaker;

  chinese.SayHello();

  //调用美国人招呼方法 

  IAmericanGreeting American=(IAmericanGreeting)speaker;

  American.SayHello();

}

当Main函数执行的时候,得到的接口是两个 “你好”;

这并不是我们期望的结果,所以这种情况下,我们必须使用显式的接口实现方式来解决这个命名冲突问题。

//Speaker类实现了两个接口

public class Speaker:IChineseGreeting,IAmericanGreeting

{

  //显式接口实现

  void IChineseGreeting.SayHello()

  {

    Console.WriteLine("你好");

  }

  

  //显式接口实现

  void IAmericanGreeting.SayHello()

  {

    Console.WriteLine("Hello");

  }

}

使用这种方式就可以解决命名冲突问题。在使用显示的接口山西ian方式时,需要注意一下几个问题:

  • 若显式实现接口,方法不能使用任何访问修饰符,显式实现的成员都默认为私有。
  • 显式实现的成员默认是私有的,所以这些成员都不能通过类的对象进行访问。正确的调用方法是把speaker对象显式地转换成对应的接口,通过接口来调用SayHello方法。

针对以上的两种方式:显式实现和隐式实现,下面针对两种实现的区别和使用场景进行总结:

  • 采用隐式接口实现时,类和接口都可以访问接口中的方法;而若采用显式接口实现方式,接口方法只能通过接口来完成访问,因此此时接口方法默认为私有。
  • 当类实现单个接口时,通常使用隐式接口实现方式,这样类的对象可以直接去访问接口方法。
  • 当类实现了多个接口,并且接口中包含相同的方法名称、参数和返回类型时,则应使用显式接口实现方式。即使没有相同的方法签名,在实现多个接口时,扔推荐使用显式的 方法,因为这样可以标识出哪个方法属于哪个接口。

4、接口与抽象类

这里主要是阐述一下两者的区别:

  • 抽象类使用abstract关键字进行定义,而接口使用interface进行定义;他们都不能进行实例化。
  • 抽象类中可以包含虚方法、非抽象方法和静态成员;但接口中不能包含虚方法和任何静态成员,并且接口中只能定义方法,不能有具体实现,方法的具体实现由实现类完成。
  • 抽象类不能实现多继承,接口则支持多继承。注意,从严格意义上说,类接触接口应该成为类实现接口。
  • 抽象类是对一类对象的抽象,继承于抽象类的类与抽象类为属于的关系;而类实现接口只是代表实现类具有接口声明的方法,是一种Can-DO的关系。所以一般接口后都带有able字段,表示“我能做”的意思。

上面的几点只是接口与抽象类之间差异的主要方法,它们还有很多的不同,大家可以参考一下别的书籍或者别的博客。

这次是C#中的接口的更多相关文章

  1. jmeter中测试接口

    本文主要介绍在jmeter中测试接口:主要从以下几个方面进行说明: 1.jmeter简介 2.jmeter怎么做接口测试 3.jmeter进行参数化的几种形式 4.jmeter中处理乱码方法 5.jm ...

  2. MyBatis 中 Mapper 接口的使用原理

    MyBatis 中 Mapper 接口的使用原理 MyBatis 3 推荐使用 Mapper 接口的方式来执行 xml 配置中的 SQL,用起来很方便,也很灵活.在方便之余,想了解一下这是如何实现的, ...

  3. 通过拦截器Interceptor实现Spring MVC中Controller接口访问信息的记录

    java web工程项目使用了Spring+Spring MVC+Hibernate的结构,在Controller中的方法都是用于处理前端的访问信息,Controller通过调用Service进行业务 ...

  4. 【总结】浅谈JavaScript中的接口

    一.什么是接口 接口是面向对象JavaScript程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...

  5. 介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图

    这个教程是从UE4 Wiki上整理而来. 在C++中直接使用Interface大家应该很熟悉.只是简单先定义一个个有虚函数的基类,然后在子类中实现相应的虚函数.像这样的虚函数的基类一般概念上叫接口.那 ...

  6. Myeclipse中打开接口实现类的快捷键

    Myeclipse中打开接口实现类的快捷键-----Ctrl + T Myeclipse中 Open Type快捷键-----Ctrl + Shift + T

  7. 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案

    方案特点: 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案,简化软件开发流程,减少各应用系统相同模块的重复开发工作,提高系统稳定性和可靠性. 基于HTTP协议的开发接口 使用特点在网页 ...

  8. Android中的接口回调技术

    Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James ...

  9. Spring中Ordered接口简介

    目录 前言 Ordered接口介绍 Ordered接口在Spring中的使用 总结 前言 Spring中提供了一个Ordered接口.Ordered接口,顾名思义,就是用来排序的. Spring是一个 ...

随机推荐

  1. HDU-1395 2^x mod n = 1

    http://acm.hdu.edu.cn/showproblem.php?pid=1395 怎样取余是关键.. 2^x mod n = 1 Time Limit: 2000/1000 MS (Jav ...

  2. JS小知识点----基本包装类型和引用类型

    var s1 = "some text"; s1.color = "red"; alert(s1.color);  //弹出 underfined var s1 ...

  3. HDOJ/HDU 1113 Word Amalgamation(字典顺序~Map)

    Problem Description In millions of newspapers across the United States there is a word game called J ...

  4. Linux系统下如何修改主机名

    vi /etc/sysconfig/network vi /etc/hosts sudo hostname

  5. uva 3523 Knights of the Round Table

    题意:给你n,m n为有多少人,m为有多少组关系,每组关系代表两人相互憎恨,问有多少个骑士不能参加任何一个会议. 白书算法指南 对于每个双联通分量,若不是二分图,就把里面的节点标记 #include ...

  6. JavaScript高级程序设计43.pdf

    事件类型 Web浏览器中有很多事件类型,“DOM3级事件”规定了以下几类事件 UI事件(用户界面),当用户与页面上的元素交互时触发: 焦点事件,当元素获得或失去焦点时触发 鼠标事件,当用户通过鼠标在页 ...

  7. ASP.NET中设置一个定时器来定时更新 转

    asp.net 定时器 比较少用,  中国红木网这是一个相当实用的功能,有了RSS博客镜像,就不需要在多处同时发布博客日志了.比如你同时在新浪上有自己的博客,又同时有自己的个人博客站点,那么你只需要在 ...

  8. (转载)WindowsXP上安装和运行神器SqlMap的步骤

    在Windows XP上安装和运行SqlMap的步骤…… 1.首先下载SqlMap 点击下载. https://codeload.github.com/sqlmapproject/sqlmap/leg ...

  9. HDU4283:You Are the One(区间DP)

    Problem Description The TV shows such as You Are the One has been very popular. In order to meet the ...

  10. 小物件之select单选下拉列表

    有时候在控制器中做了一个数组 然后需要在模板view中循环 同时还需要判断是否有选中的值,就会造成很多开始闭合标签 以前都是这样写 这样实在太繁琐了,不如封装一个小物件 封装函数如下: 代码如下: f ...