1, 接口的定义?

  答:接口表示一组函数成员而不实现成员的引用类型,类和结构可以实现接口。

2, 接口的意义及为什么要使用接口?

  要理解接口的意义以及为什么它是有用的,让我们先来看看下面的代码,它接受了一个没有排序的整数数组并且按升序进行排序。

class Program

    {

static voidMain(string[] args)

        {

var myInt = new[] { 20,4,16,9,2};//隐式创建整形数组。

            Array.Sort(myInt);//调用Array类的Sort方法对数组进行排序,默认为升序。

foreach (var item in myInt)//使用foreach语句遍历数组。

            {

                Console.Write("{0}",item);

                Console.Write("");

            }

            Console.ReadKey();

        }

}

程序输出结果为:

Sort方法在int数组上工作得很好,但是如果我们尝试在自己的类上使用会发生什么样的结果呢?如下代码所示:

class Program

    {

static voidMain(string[] args)

        {

var myInt=new []{20,4,16,9,2};//隐式创建整形数组。

            MyClass[] mc=new MyClass[5];//创建MyClass对象数组。

for (int i = 0; i < 5; i++)//初始化数组

            {

                mc[i] = new MyClass();

                mc[i].TheValue=myInt[i];

            }

            Array.Sort(mc);//调用Sort方法时会引发异常。

foreach (var item in mc)

            {

                Console.Write("{0}",item);

                Console.Write("");

            }

            Console.ReadKey();

        }

    }

class MyClass//自定义类MyClass

    {

public int TheValue;

}

程序会抛出一个异常,如下图:

这是什么原因呢?Sort不工作的原因是,对于用户自定义对象的数组而言,它不知道如何比较用户自定义对象和确定它们的次序,它需要数组中的对象实现IComparable接口。在Sort运行时,它通过调用元素的CompareTo方法并传入另外一个元素的引用作为参数来实现数组的一个元素和另一个元素的比较。

所以,我们可以通过让类实现IComparable接口来使Sort方法可以用于MyClass对象。

代码如下:

class Program

    {

static voidMain(string[] args)

        {

var myInt = new[] { 20,4,16,9,2};

            MyClass[] mc = new MyClass[5]; //创建类MyClass对象的数组。

for (int i = 0; i < 5; i++) //初始化数组

            {

                mc[i] = new MyClass();

                mc[i].TheValue=myInt[i];

            }

            PrintOut("原始数组顺序:", mc);//调用静态PrintOut方法输出初始数组。

            Array.Sort(mc);

            PrintOut("经过Sort后的顺序:", mc);//调用静态PrintOut方法输出排序后的数组。

            Console.ReadKey();

        }

static void PrintOut(string s, MyClass[] mc)//定义静态方法PrintOut实现遍历数组并输出数组元素。

        {

            Console.Write(s);

foreach (var item in mc)

            {

                Console.Write("{0}",item.TheValue);

                Console.Write("");

            }

            Console.WriteLine();//换行

        }

    }

class MyClass : IComparable //类实现接口

    {

public int TheValue;

public int CompareTo(object obj) //接口成员方法实现

        {

            MyClass mc=(MyClass)obj;

if (this.TheValue < mc.TheValue) return -1;

if (this.TheValue > mc.TheValue) return 1;

return 0;

        }

}

程序输出结果为:

在MyClass类中实现接口IComparable接口的示意图:

3, 声明接口?

  例如:

interface IMyInterface1 //声明接口IMyInterface1

    {

int Do1(int i, long l);

double Do2(string s, long l);

}

  需要注意以下几点:

  1>    声明接口使用interface关键字。

  2>    接口名称必须从大写的I开始(如:ISaveable)。

  3>    接口函数成员的声明不能包括任何实现代码,而在每一个成员声明的主体的后面必须使用分号。

  4>    接口声明可以有任何的访问修饰符public,protected,private等,但是接口的成员是隐式public的,不允许有任何访问修饰符,包括public。

4, 实现接口?

  只有类和结构才能实现接口。要实现接口,类或结构必须注意以下几点:

  1>    在基类列表中包括接口名称。

  2>    为每一个接口的成员提供实现。

  3>    如果类从基类继承并实现接口,基类列表中的基类名称必须放在任何接口之前。

  例如:

interface IMyInterface1 //声明接口IMyInterface1

    {

int Do1(int i, long l);

double Do2(string s, long l);

    }

class MyClass : IMyInterface1 //实现接口

    {

int Do1(int i, long l) //实现接口成员

        {

//todo:方法体

        }

double Do2(string s,long l)

        {

//todo:方法体

        }

}

5, 简单接口的示例?

  代码如下:

interface IIfc1 //声明接口

    {

void PrintOut(string s);

    }

class MyClass : IIfc1 //实现接口。

    {

public void PrintOut(string s) //实现接口成员

        {

            Console.WriteLine("Calling through:{0}",s);

            Console.ReadKey();

        }

    }

class Program

    {

static voidMain(string[] args)

        {

            MyClass mc = new MyClass(); //创建实例

            mc.PrintOut("object"); //调用类对象的方法。

        }

}

程序输出结果为:

以上是我的简单总结,今天先写到这儿,欢迎大家点评,谢谢!

转载于:https://www.cnblogs.com/mcgrady/archive/2011/11/06/2238212.html

C#3.0学习笔记(8)浅谈接口interface相关推荐

  1. 转 Android开发学习笔记:浅谈WebView

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 ...

  2. android 自定义菜单开发,Android开发学习笔记:浅谈3大类菜单

    在Android系统中,菜单可以分为三类:选项菜单(Option Menu),上下文菜单(Context Menu)以及子菜单(Sub Menu). 一.选项菜单(Option Menu) 创建选项菜 ...

  3. Android开发学习笔记:浅谈Content Provider

    一.Content Provider的概念介绍 Content Providers是所有应用程序之间数据存储和检索的桥梁,它使得各个应用程序之间实现数据共享.是应用程序间共享数据的唯一途径.Conte ...

  4. 【学习笔记】浅谈短小可爱的左偏树(可并堆)

    文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...

  5. 【学习笔记】浅谈广义矩阵乘法——动态DP

    文章目录 广义矩阵乘法 动态DP 例题:洛谷4719 以下内容是本人做题经验,如有雷同,纯属抄袭:如有不对,纯属不懂,还请指正 广义矩阵乘法 众所周知,矩阵满足乘法交换律,前一个矩阵的列必须是后一个矩 ...

  6. Android开发学习笔记:浅谈ToggleButton

    ToggleButton(开关按钮)是Android系统中比较简单的一个组件,是一个具有选中和未选择状态双状态的按钮,并且需要为不同的状态设置不同的显示文本. ToggleButton常用的XML属性 ...

  7. 学习笔记:浅谈NP完全性问题

    迄今为止,我们所研究的所有算法几乎都是多项式时间的算法:对于规模为n的输入,在最坏情况下的运行时间是O(n^k),其中k为某一确定的常数. 如果一个判定问题的复杂度是该问题的一个实例的规模n的多项式函 ...

  8. 【学习笔记】浅谈闵可夫斯基和

    学这东西主要是 这道题 要用 233 定义:给定两个凸包AAA,BBB,定义C={a+b∣a∈A,b∈B}C=\{a+b|a\in A,b\in B\}C={a+b∣a∈A,b∈B} ,其中aaa,b ...

  9. Docker学习笔记之浅谈虚拟化和容器技术

    0x00 概述 相信所有对 Docker 有所耳闻的朋友都知道,它是一款以容器虚拟化技术为基础的软件,因此在了解有关 Docker 的概念知识和使用方法之前,虚拟化和容器技术是我们不可或缺的基础知识. ...

最新文章

  1. RAC 修改 DB 实例名 步骤
  2. Git log、diff、config 进阶
  3. varnish缓存服务器构建疑问
  4. 【Python CheckiO 题解】Index Power
  5. Windows MinGW配置C、C++编译环境
  6. Angular4.x 安装|创建项目|目录结构|创建组件
  7. 同学大多数都是上的整个网站重点我的
  8. 20200827:2020力扣第33周双周赛题解
  9. 恋舞ol服务器维护中,《恋舞OL》更新维护公告
  10. macOS Monterey 12.0beta4黑苹果镜像虚拟机版本
  11. 前端js获取屏幕高度
  12. MongoDB基本操作
  13. 数据分析图表配色大全,可视化设计走高级路线的一定要看
  14. ipad如何与计算机连接网络连接不上,苹果平板ipad的无法连接无线网络WiFi如何解决...
  15. win10 1073linux密码,Linux Bash on Win10 忘记密码解决
  16. 做网站怎样抓住搜索引擎规则
  17. 【CCF会议期刊推荐】CCF推荐国际学术期刊/会议(计算机图形学与多媒体)
  18. 比尔盖茨离婚事件:给想进互联网大厂的人的唯一启示
  19. 杭电ACM 1003
  20. 三维形体投影面积(java)

热门文章

  1. 2011年全国软件大赛模拟题及参考答案(Java本科组)
  2. java 洗牌_java数组之完美洗牌算法
  3. git url地址无效_如何同步多个 git 远程仓库
  4. python 怎么安装电脑摄像头模块_Python模块及安装
  5. 每天一道LeetCode-----以字符串的形式输出二叉树所有从根节点到叶子节点的路径
  6. LVS(11)——wrr
  7. windows7不支持AllocateAndGetTcpExTableFromStack
  8. Logrotate 对服务器日志按照小时切割并压缩
  9. C++直接初始化与复制初始化的区别深入解析
  10. 简单说明c语言中常用的基本数据类型有哪些,C语言基本数据类型的.ppt