这一篇来源于网络,简单介绍了接口的概念

接口是体现面向对象编程思想优越性的一件利器,为什么这么说呢?

首先我们来看,接口是为继承而存在的,如果没有继承,那就自然不需要接口了,既然有继承,那就需要把可能被多个类所继承的一些公共部分抽象出来,接口封装的就是这些公共的行为规范(方法定义),类可以通过继承多个接口来丰富自己的行为机制,但是在C#中,类是不可以继承多个类的。

C#最显著的特点就是极大地提高了程序的开发效率和维护效率,所以对于继承多个类这种容易引起二义性的机制是深恶痛绝的。

我们都是由学生时代一路走过来的,所以我想借用学生时代的那些行为规范来作为现实生活中的接口的例子。

读小学的时候,我们至少会有两套行为规范:小学生行为规范和少先队员行为规范。首先我们都得遵守小学生行为规范,其次如果是少先队员,就还得遵守少先队员行为规范。我们对于这两套行为规范不列举太多细节规则,每套一条就够了,首先,作为少先队员,过马路时要先看红绿灯:

   : interface IPupilRule
: {
: void CrossTheRoad(int trafficLightIndex);
: }

在IPupileRule中,我们定义了“过马路看红绿灯”这样的行为规范,它其实就是一个函数声明,定义了函数名、返回值类型以及参数类型等信息,但是并没有函数体。对,接口中只能有函数定义这样的指导性原则,不允许存在函数体,至于具体的实现细节,那就“具体问题具体分析”吧。接下来我们再来定义少先队员行为规范,也不列举太多细则,一条足矣,少先队员不能抽烟:

   : interface IYoungPioneerRule
: {
: void NoSmoke();
: }

同样的,只有函数声明没有实现细节,因为行为守则这样的东西只能告诉你作为一名光荣的少先队员是绝对不能抽烟的,它不会也不能面面俱到地告诉你假如你叔叔阿姨给你递烟应该如何谢绝,假如你爸爸教你抽烟应该如何拒绝,另外假如那些辍学的坏孩子强迫你抽烟又该如何反抗等等。废话不多说,否则真成了“提供函数体的接口”了。

既然接口是不提供函数实现细节的,那么当一个小学生需要横过马路的时候,就只能靠他自己来完成具体的逻辑实现了:

   : public class Pupil : IPupilRule
: {
: /// <summary>
: /// Cross the road and notice the traffic light.
: /// </summary>
: /// <param name="trafficLightIndex">The index of traffic light.</param>
: public void CrossTheRoad(int trafficLightIndex)
: {
: switch (trafficLightIndex)
: {
: case : // Red, stop.
: break;
: case : // Yellow, stop.
: break;
: case : // Green, go.
: break;
: default: // Unknown situation, thinking.
: break;
: }
: }
: }

接下来,少先队员出场了。首先我们来分析一下这个场景,少先队员是需要遵守少先队员行为规范的小学生。由此可见,少先队员需要实现前面提到的两种行为规范中的所有规定,这也就体现了接口的好处,可以实现多重继承。当然,在本文所用的例子当中,少先队员大可不必重新继承并实现IPupilRule接口了,他既然是一名小学生,那就可以继承Pupil这个类,而且他并不需要改变Pupil中对小学生行为规范的具体实现细节,他只需要自己实现少先队员行为规范中的规定就行了。

总结:一个类可以同时继承类和接口(两种形式)

: public class YoungPioneer : Pupil, IYoungPioneerRule
: {
: /// <summary>
: /// Young pioneer should help other people.
: /// </summary>
: public void NoSmoke()
: {
: throw new NotImplementedException("I can't smoke because I'm a young pioneer.");
: }
: }

另外,接口也是可以继承接口的,并且可以多重继承。我们假设有一个向阳小学,这个学校还有自己的校规,校规内容不多,主要是要求学生要严格遵守小学生行为规范和少先队员行为规范,并且都要会唱校歌。

总结:①接口也可以继承接口,②还可以多重继承。

   : interface IXiangYangSchoolRule : IPupilRule, IYoungPioneerRule
: {
: void SingSchoolSong();
: }

因此这套校规编写起来倒不麻烦,继承了两套现成的行为规范并且增加一点儿自己的要求就行了。向阳小学的每一位学生都得遵守这套校规:

  : public class XiangYangPupil : IXiangYangSchoolRule
: {
: public void SingSchoolSong()
: {
: Console.WriteLine("I love Xiang Yang School!");
: }
:
: public void CrossTheRoad(int trafficLightIndex)
: {
: throw new NotImplementedException();
: }
:
: public void NoSmoke()
: {
: throw new NotImplementedException();
: }
: }

补充例子:两个对象的比较

    class Data : IComparable //实现IComparable接口;
{
public int data;
public int CompareTo(object obj)
{
Data mc = (Data)obj;
if (this.data > mc.data)
{
return ;
}
else if (this.data < mc.data)
{
return -;
}
return ;
}
}
class Program
{
static void Main(string[] args)
{
var myInt = new []{ , , , , };
Data []data = new Data[];
for(int i=;i<;i++)
{
data[i] = new Data();
data[i].data = myInt[i];
}
Array.Sort(data);
for (int i = ; i < ; i++)
{
Console.WriteLine(data[i].data);
}
}
}

C#重点内容之:接口(interface)(一)网络初级示例的更多相关文章

  1. JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

    JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来 ...

  2. 0507 构造代码块和static案例,接口interface

    0507构造代码块和static案例,接口interface [重点] 1.局部变量,成员变量,静态变量的特点 2.接口 接口语法:interface A {} 接口内的成员变量[缺省属性]publi ...

  3. php中的抽象类(abstract class)和接口(interface)

    一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...

  4. php接口interface的使用

    接口是什么? 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容. 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有 ...

  5. delphi 接口Interface

    学习 delphi 接口 一切都是纸老虎!!! 第四章          接口 前不久,有位搞软件的朋友给我出了个谜语.谜面是“相亲”,让我猜一软件术语.我大约想了一分钟,猜 出谜底是“面向对象”.我 ...

  6. go面向对象之多态即接口(interface)

    Go 语言接口 Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口. 实例 /* 定义接口 */ type interface ...

  7. java中接口interface和private私有内部类怎样一块配合着用?

    3.接口interface和private内部类协同工作[新手可忽略不影响继续学习]马克-to-win:由于是private内部类,外面无法访问甚至无法看到你编的源代码(如果在不同的包中),非常安全. ...

  8. java中的接口interface

    关于接口 接口描述了实现了它的类拥有什么功能.因为Java是强类型的,所以有些操作必须用接口去约束和标记.接口作为类的能力的证明,它表明了实现了接口的类能做什么. 类似与class,interface ...

  9. 14 接口-interface的定义与实现

    接口的基本语法一: 1.使用interface 定义 2.接口当中的方法都是抽象方法 3.接口当中的方法都是public权限 接口的定义: interface USB { public void re ...

随机推荐

  1. Linux Centos7 虚拟机上网设置

    一.Windows下网卡,共享上网模式 二.虚拟机VMnet8的网卡模 三.Linux 下配置网卡 命令: vi /etc/sysconfig/network-scripts/ifcfg-ens33 ...

  2. (O)JS核心:call、apply和bind

    1. var func=function(a,b,c){ console.log([a,b,c]); }; func.apply(null,[1,2,3]); //[1,2,3] func.call( ...

  3. Jsonpath的基本使用

    JSONPath - 是xpath在json的应用. xml最大的优点就有大量的工具可以分析,转换,和选择性的提取文档中的数据.XPath是这些最强大的工具之一.   如果可以使用xpath来解析js ...

  4. Java中关键字static的使用

    static 关键字 1).static只能修饰成员变量或成员方法,所有非静态是对象相关的,所有静态是类相关的. 2)被static修饰的成员变量成员方法独立于该类的任何对象,它不依赖类的特定的实例, ...

  5. Luogu2149 [SDOI2009]Elaxia的路线-最短路+拓扑排序

    Solution 另外$ m <=5e5$. 两条最短路的 最长公共路径 一定是若干条连续的边, 并且满足拓扑序. 于是我们分别 正向 和反向走第二条路径,若该条边同时是两条最短路径上的边, 则 ...

  6. Tinyos学习笔记(三)

    读取Telosb内部传感器数据,并在计算机上显示. senseC.nc代码如下: #include "Timer.h" #include "sense.h" # ...

  7. 使用Loadrunner对IBM MQ进行性能测试

    一.概述         使用Loadrunner对IBM MQ进行性能测试,需要用到java vuser以及java编码知识.此次先介绍什么是IBM MQ,然后java vuser的使用与配置细节, ...

  8. 大神的P图过程!快来偷窥!

    来自美国的艺术家James(@jameasons) 平时我们总是能看到一些大神合成出这样的图片, 但是他们P图的过程是怎样的,很多人都是不知道的. 接下来再看看这位大神的其他作品, 如果你看了上面视频 ...

  9. Window7安装tensorflow整套环境详细流程

    安装tensorflow方式有好多种,为了方便编译环境以及包管理,这里采用Anaconda平台安装tensorflow. tensorflow官网:http://www.tensorflow.org/ ...

  10. refused to Connection

    两种情况: .数据库账号密码错误 .mysql挂了