一 什么是接口

接口是指定一组函数成员而不实现它们的引用类型。

class Program
{
static void FlyFunc(IFly obj)
{
obj.Fly();
} static void Main(string[] args)
{
var bird = new Bird();
var butterfly = new Butterfly();
FlyFunc(bird);
FlyFunc(butterfly);
Console.Read();
}
} //声明一个IFly接口
interface IFly
{
void Fly();
} class Bird : IFly
{
public void Fly()
{
Console.WriteLine("Bird Fly");
}
} class Butterfly : IFly
{
public void Fly()
{
Console.WriteLine("Butterfly Fly");
}
}

二 使用IComparable接口的示例

Array类有一个静态方法Sort(),可以排序元素。

var array = new int[] { 50, 15, 59, 88, 14 };
Array.Sort(array);
foreach (var item in array)
Console.Write($"{item} "); //输出 14 15 50 59 88

Array类的Sort方法倚赖于IComparable接口,它声明在BCL中,包含唯一的方法CompareTo。

.NET文档中描述了CompareTo方法的作用,在调用CompareTo方法时,它应该返回以下几个值:

  • 负数值:当前对象小于参数对象;
  • 正数值:当前对象大于参数对象;
  • 零:两个对象在比较时相等;

Sort使用的算法倚赖于元素的CompareTo方法来决定两个元素的次序。

class Program
{
static void Main(string[] args)
{
var myInt = new int[] { 10, 20, 1, 5, 50 };
var mcArr = new MyClass[5];
for (int i = 0; i < 5; i++)
{
mcArr[i] = new MyClass() { TheValue = myInt[i] };
}
foreach (var item in mcArr)
{
Console.Write($"{item.TheValue} ");
}
Console.WriteLine();
Array.Sort(mcArr); //排序
foreach (var item in mcArr)
{
Console.Write($"{item.TheValue} ");
}
Console.ReadLine();
//输出: 10 20 1 5 50
1 5 10 20 50
}
} //自定义的MyClass类,实现IComparable接口
class MyClass : IComparable
{
public int TheValue { get; set; } public int CompareTo(object obj)
{
var mc = (MyClass)obj;
if (this.TheValue < mc.TheValue) return -1;
if (this.TheValue > mc.TheValue) return 1;
return 0;
}
}

三 声明接口

接口声明不能包含数据成员和静态成员。

接口声明只能包含以下类型的非静态成员函数的声明:

  • 方法
  • 属性
  • 事件
  • 索引器

这些函数成员的声明不能包含任何实现代码,而在每一个成员声明的主体后必须使用分号。

按照惯例,接口名称以大写 I 开头,比如 ISaveable。

与类和结构一样,接口声明还可以分隔成分部接口声明。

接口声明可以有任何的访问修饰符,public、protected、internal、private。

接口的成员是隐式public的,不允许有任何修饰符,包括public。

四 实现接口

只有类和结构才能实现接口。

要实现接口,类和结构必须:

  • 在基类列表中包括接口名称
  • 为每一个接口成员提供实现
//声明接口
interface IMyInterface
{
int ID { get; set; }
void Method(string s);
}
//实现接口
class MyInterface : IMyInterface
{
public int ID { get; set; }
public void Method(string s)
{
Console.WriteLine(s);
}
}

类和结构可以实现任意数量的接口。

interface IDataRetrieve
{
int GetData();
} interface IDataStore
{
void SetData(int x);
} class MyData : IDataRetrieve, IDataStore
{
int Mem1;
public int GetData()
{
return Mem1;
} public void SetData(int x)
{
Mem1 = x;
}
} static void Main(string[] args)
{
var myData = new MyData();
myData.SetData(5);
Console.WriteLine($"data is : {myData.GetData()}");
}

五 实现具有重复成员的接口

由于类可以实现任意数量的接口,有可能两个或多个接口成员都有相同的签名和返回类型。

这种情况下,类可以实现单个成员满足所有包含重复成员的接口。

interface IIfc1
{
void PrintOut(string s);
} interface IIfc2
{
void PrintOut(string s);
} class MyClass : IIfc1, IIfc2 //实现两个接口
{
void PrintOut(string s) //两个接口的单一实现
{
Console.WriteLine(s);
}
}

六 显示接口成员实现

如果希望为每一个接口分离实现,可以通过创建显示接口成员实现。

class MyClass : IIfc1, IIfc2    //实现两个接口
{
void IIfc1.PrintOut(string s) //显示实现IIfc1
{
Console.WriteLine($"IIfc1 : {s}");
} void IIfc2.PrintOut(string s) //显示实现IIfc2
{
Console.WriteLine($"IIfc2 : {s}");
}
}

七 派生成员作为实现

实现接口的类可以从它的基类继承实现的代码

interface IIfc1
{
void PrintOut(string s);
} interface IIfc2
{
void PrintOut(string s);
} class MyClass : IIfc1, IIfc2 //实现两个接口
{
void IIfc1.PrintOut(string s) //显示实现IIfc1
{
Console.WriteLine($"IIfc1 : {s}");
} void IIfc2.PrintOut(string s) //显示实现IIfc2
{
Console.WriteLine($"IIfc2 : {s}");
}
} class MyDerivedClass : MyClass
{
} static void Main(string[] args)
{
var myDericed = new MyDerivedClass();
((IIfc1)myDericed).PrintOut("111");
((IIfc2)myDericed).PrintOut("222");
Console.Read();
}

C#-11 接口的更多相关文章

  1. ionic访问odoo 11接口

    在架设完毕odoo 11的网站之后,第一次面临手机app该如何访问后台网站的问题,是不是模式类似asp.net mvc 那样的模式,或者还存在其他的访问方法,带着这个疑问与困惑,开始的我的研究学习之路 ...

  2. java基础(11):接口、多态

    1. 接口 1.1 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成. ...

  3. 11_Java面向对象_第11天(接口、多态)_讲义

    今日内容介绍 1.接口 2.多态 01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的"类". 接口只描述所应该具备的方法,并没有具 ...

  4. TypeScript:基本类型和接口

    返回TypeScript手册总目录 基本类型(Basic Types) 为了让程序可以使用,我们需要用到一些最简单的数据单元:数字,字符串,结构,布尔值,诸如此类.在TypeScript中,支持许多正 ...

  5. shopncv4 短信接口 提供商 中国短信网

    前提是在后台开启手机注册功能:具体是在设置->账号同步->手机短信 里开启.   修改 siteroot\core\framework\libraries\sms.php   修改 sit ...

  6. php抽象类和接口的区别

    php抽象类和接口的区别 tags:抽象类 接口 抽象类和接口 php 引言:这是一个面试经常被问到的问题,也是一个经典问题.我们尽量引用官方权威的说明或者经过实验来证明本文所说的内容准确性. 抽象类 ...

  7. C# 接口的使用(工厂模式)

    接口(interface)与抽象类(abstract)的区别: 相同点: 1.都不能被直接实例化,都可以通过继承实现其抽象方法. 2.都是面向抽象编程的技术基础,实现诸多模式 不同点: 1.接口可以多 ...

  8. 面向对象php 接口 抽象类

    1.定义类和实例化对象: 使用关键字class定义类,使用new实例化对象: 2.类成员的添加和访问: 类成员:有属性,方法,常量(常量名不带$符): 访问属性的时候,变量名不带$符 添加属性需要使用 ...

  9. Java 面向对象之接口、多态

    01接口的概念 A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成 ...

随机推荐

  1. 造!又有新的生产力语言了「GitHub 热点速览 v.22.30」

    作者:HelloGitHub-小鱼干 你还记得那些 PHP 开发都去哪了吗?转 Golang 了!移动端现在流行什么?Flutter 编程.现在谷歌带着新的生产力语言来了,Carbon,代号:C++ ...

  2. 关于 CMS 垃圾回收器,你真的懂了吗?

    大家好,我是树哥. 前段时间有个小伙伴去面试,被问到了 CMS 垃圾回收器的详细内容,没答出来.实际上,CMS 垃圾回收器是回收器历史上很重要的一个节点,其开启了 GC 回收器关注 GC 停顿时间的历 ...

  3. 多表查询_练习1&练习2&练习3

    准备表: -- 部门表 CREATE TABLE dept ( id INT PRIMARY KEY PRIMARY KEY, -- 部门id dname VARCHAR(50), -- 部门名称 l ...

  4. 记vs2019 The view 'xxx' was not found.

    版本:Visual Studio 2019 16.8.2/16.8.4.net core 3.1 1.检测是否是拼写错误2.检查.csproj为文件中是否包含有下面的content remove(这种 ...

  5. linux 安装Apache php mysql注意事项

    由于apache的php组件 php.so是由php安装生成的,故需在Apache安装之后才安装php比较合适 libphp5.so是php5提供的,你还需要编译php5才能生成这个文件 你在PHP的 ...

  6. Golang 汇编asm语言基础学习

    Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...

  7. linux设置系统环境变量的天坑

    在设置系统环境变量,也就是 .bash_profile 或者 /etc/proflie 或者 .bashrc 中把path写错或者是把设置系统环境变量的格式写错! 会 导致 系统无法进入.登录无限循环 ...

  8. transform: scale() 实现鼠标悬浮在元素之上出现和消失

    前言 transform属性允许你旋转,缩放,倾斜或平移给定元素.其中scale(x, y)就是实现元素缩放的属性值. scale(x, y)的 x 乘以原本元素的 x:y 乘以原本的元素 y,就可以 ...

  9. 推荐软件(一):Motrix——磁力下载器

    个人觉得迅雷这样的下载器广告又多,启动速度又慢,又占用内存和存储,非常地不好用.有时候下载速度也不是你自己网速的最大值,而且有一些资源也会因为版权问题阻止你下载. Motrix 界面非常简洁:下载速度 ...

  10. Excel 逻辑函数(一):IF 和 IFS

    IF IF 函数有三个参数,第一个为条件判断,第二个是当条件为真时执行的表达式,第三个是条件为假时执行的表达式. IF(A1="是", A2 * 0.8, 0),如果 A1 单元格 ...