C# 接口(Interface)

接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。

接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。

抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。

接口是引用类型的,类似于类,和抽象类的相似之处有三点:
       1、不能实例化;
       2、包含未实现的方法声明;
       3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

另外,接口有如下特性:接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。

C#接口的作用 

1.接口用于描述一组类的公共方法/公共属性. 它不实现任何的方法或属性,只是告诉继承它的类《至少》要实现哪些功能,继承它的类可以增加自己的方法.

2.使用接口可以使继承它的类: 命名统一/规范,易于维护.比如: 两个类 "狗"和"猫",如果它们都继承了接口"动物",其中动物里面有个方法Behavior(),那么狗和猫必须得实现Behavior()方法,并且都命名为Behavior这样就不会出现命名太杂乱的现象.如果命名不是Behavior(),接口会约束即不按接口约束命名编译不会通过.

3.提供永远的接口。 当类增加时,现有接口方法能够满足继承类中的大多数方法,没必要重新给新类设计一组方法,也节省了代码,提高了开发效率

声明接口

接口使用 interface 关键字声明,它与类的声明类似。接口声明默认是 public 的。下面是一个接口声明的实例:

  1. //公共接口: "动物"
  2. public interface IAnimal
  3. {
  4. void Behavior(); //行为方法,描述各种动物的特性
  5. }
  6.  
  7. //类: 狗
  8. public class Dog : IAnimal
  9. {
  10. public void Behavior()
  11. {
  12. //Console.Write("我晚上睡觉,白天活动");
  13. MessageBox.Show("我晚上睡觉,白天活动");
  14. }
  15. }
  16.  
  17. //类: 猫
  18. public class Cat : IAnimal
  19. {
  20. public void Behavior()
  21. {
  22. //Console.Write("我白天睡觉,晚上活动");
  23. MessageBox.Show("我白天睡觉,晚上活动");
  24. }
  25. }
  26. //简单的应用:
  27. public static Main()
  28. {
  29. Dog myDog = new Dog();
  30. myDog.Behavior(); //输出: "我晚上睡觉,白天活动"
  31. Cat myCat = new Cat();
  32. myCat.Behavior(); //输出: "我白天睡觉,晚上活动"
  33. }

以上调用不同的类的相同名方法,会输出不同的东东,也就是说每个类里面的同名方法完成的功能可以是完全不同的.

更进一步,不是用上面Main方法这样一个一个调用类的方法,用多态性实现其调用.

看一下下面这个方法:

  1. public void Behavior(IAnimal myIanimal)
  2. {
  3. myIanimal.Behavior();
  4. }

其参数是接口类型,任何继承它的类都可以调用此方法,此方法能根据类的不同调用不同的类 中的方法. 也即能够自己根据不同的类,完成不同的类的功能.

多态性代码示例:

  1. Dog myDog = new Dog();
  2. Cat myCat = new Cat();
  3. Behavior(myDog); //Behavior接受“狗”类实例
  4. Behavior(myCat); //Behavior接受“狗”类实例

这样Behavior方法写一次就能完成所有继承它的类中的相同名方法的不同功能. 非常方便,同样,由于“动物软件”功能需求,需要再增加一个"龟"类:

  1. //类: 龟
  2. public Tortoise: IAnimal
  3. {
  4. public void Behavior()
  5. {
  6. MessageBox.Show("我可以不活动,一睡就睡五千年!");
  7. }
  8. }

那么也可以调用上面多态方法,所以说接口使方法具有较好扩展性. 如果继承它的类很多的话,有多少好处是可想而知的!(出处:http://blog.csdn.net/yunhaic/article/details/6662843)

同样,假设我们公司有两种程序员:VB程序员,指的是用VB写程序的程序员,用clsVBProgramer这个类表示;Delphi程序员指的是用Delphi写程序的程序员,用clsDelphiProgramer这个类来表示。每个类都有一个WriteCode()方法。定义如下:

  1. public class clsVBProgramer
  2. {
  3. public void WriteCode()
  4. {
  5. //用VB语言写代码;
  6. }
  7. }
  8.  
  9. public class clsDelphiProgramer
  10. {
  11. public void WriteCode()
  12. {
  13. //用Delphi语言写代码;
  14. }
  15. }
  16.  
  17. public class clsProject
  18. {
  19. public void WritePrograme(clsVBProgramer programer)//用VB写代码
  20. {
  21. programer.WriteCode();
  22. }
  23. public void WritePrograme(clsDelphiProgramer programer)//重载方法,用Delphi写代码
  24. {
  25. programer.WriteCode();
  26. }
  27. }
  28.  
  29. static void Main(string[] args)
  30. {
  31. clsProject proj = new clsProject();
  32. //如果需要用VB写代码
  33. clsVBProgramer programer1 = new clsVBProgramer();
  34. proj.WritePrograme(programer1);
  35. //如果需要用Delphi写代码
  36. clsDelphiProgramer programer2 = new clsDelphiProgramer();
  37. proj.WritePrograme(programer2);
  38. }

但是如果这时公司又来了一个C#程序员,我们怎么改这段程序,使它能够实现用C#写程序的功能呢?我们需要增加一个新类clsCSharpProgramer,同时在此clsProject这个类中要再次重载WritePrograme(clsCSharpProgramer programer)方法。这下麻烦多了。如果还有C程序员,C++程序员,JAVA程序员呢。麻烦大了!

但是如果改用接口,就完全不一样了:
首先声明一个程序员接口:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. clsProject proj = new clsProject();
  6. IProgramer programer;
  7. //如果需要用VB写代码
  8. programer = new clsVBProgramer();
  9. proj.WritePrograme(programer);
  10. //如果需要用Delphi写代码
  11. programer = new clsDelphiProgramer();
  12. proj.WritePrograme(programer);
  13.  
  14. }
  15. }
  16. /// <summary>
  17. /// 声明接口
  18. /// </summary>
  19. public interface IProgramer
  20. {
  21. void WriteCode();
  22. }
  23. //然后声明类,并实现IProgramer接口:
  24. /// <summary>
  25. /// VB程序员实现的WriteCode方法
  26. /// </summary>
  27. public class clsVBProgramer : IProgramer
  28. {
  29. public void WriteCode()
  30. {
  31. //用VB语言写代码;
  32. Console.WriteLine("我是VB程序员实现的");
  33. }
  34. }
  35. /// <summary>
  36. /// Delphi程序员实现的WriteCode方法
  37. /// </summary>
  38. public class clsDelphiProgramer : IProgramer
  39. {
  40. public void WriteCode()
  41. {
  42. //用Delphi语言写代码;
  43. Console.WriteLine("我是Delphi程序员实现的");
  44. }
  45. }
  46. /// <summary>
  47. /// CSharp程序员实现的WriteCode方法
  48. /// </summary>
  49. public class clsCSharpProgramer : IProgramer
  50. {
  51. public void WriteCode()
  52. {
  53. //用Delphi语言写代码;
  54. Console.WriteLine("我是CSharp程序员实现的");
  55. }
  56. }
  57. /// <summary>
  58. /// 项目
  59. /// </summary>
  60. public class clsProject
  61. {
  62. public void WritePrograme(IProgramer programer)
  63. {
  64. programer.WriteCode();//写代码
  65. }
  66. }

这样的如果再有程序员添加进来的话,我们只需把它们相关的类加进来,然后在main()中稍做修改就OK了。扩充性特别好!

另外我们如果把clsProject这个类封成一个组件,那么当我们的用户需要要扩充功能的时候,我们只需要在外部做很小的修改就能实现,可以说根本就用不着改动我们已经封好组件!这样就很方便,很强大!(出处:http://blog.jobbole.com/85751/)

该文纯粹属于个人学习,有不足之处请多多指教!(文章部分内容摘自网络,如果侵犯您的权益,请及时联系我,谢谢。)

初识C#接口的更多相关文章

  1. 初识IStructuralEquatable接口

    System.Collections.IStructuralEquatable 是 .NET Framework 4.5 新引入的一个接口,位于System.Runtime.dll程序集中. MSDN ...

  2. Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52629598 前言:上篇中介绍O ...

  3. 初识WSGI接口

    WSGI WSGI全称为Web Server Gateway Interface,WSGI允许web框架和web服务器分开,可以混合匹配web服务器和web框架,选择一个适合的配对.比如,可以在Gun ...

  4. SDI初识

    SDI初识 SDI接口,即“数字分量串行接口(Serial Digital Interface)”.按照速率可以分为: 标准清晰度SD-SDI,速率为270Mb/s; 高清标准HD-SDI,速率为1. ...

  5. 程序员不得不知道的 API 接口常识

    说实话,我非常希望两年前刚准备找实习的自己能看到本篇文章,那个时候懵懵懂懂,跟着网上的免费教程做了一个购物商城就屁颠屁颠往简历上写. 至今我仍清晰地记得,那个电商教程是怎么定义接口的: 管它是增加.修 ...

  6. Python爬取CSDN博客文章

    0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...

  7. .net 温故知新:【8】.NET 中的配置从xml转向json

    一.配置概述 在.net framework平台中我们常见的也是最熟悉的就是.config文件作为配置,控制台桌面程序是App.config,Web就是web.config,里面的配置格式为xml格式 ...

  8. 初识 go 语言:方法,接口及并发

    目录 方法,接口及并发 方法 接口 并发 信道 结束语 前言: go语言的第四篇文章,主要讲述go语言中的方法,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示例,可直接运行. 方法,接 ...

  9. 初识Django —Python API接口编程入门

    初识Django —Python API接口编程入门 一.WEB架构的简单介绍 Django是什么? Django是一个开放源代码的Web应用框架,由Python写成.我们的目标是用Python语言, ...

随机推荐

  1. 主成分分析(PCA)原理总结

    主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一.在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.一般我们提到降维最容易想到的算法就 ...

  2. [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office

    打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...

  3. angular2系列教程(七)Injectable、Promise、Interface、使用服务

    今天我们要讲的ng2的service这个概念,和ng1一样,service通常用于发送http请求,但其实你可以在里面封装任何你想封装的方法,有时候控制器之间的通讯也是依靠service来完成的,让我 ...

  4. 《LoadRunner12七天速成宝典》签售会2016-12-17北京

    报名地址: http://www.after615.com/actives/s?id=3141&time=1480042829608&sign=9ac8e25e9ab3cf57f613 ...

  5. Canvas讲解

    1.Canvas是什么? 简单地说canvas是画布,可以进行画任何的线.图形.填充等一系列的操作,而且操作的画图就是js, 提供简单的二维矢量绘图. 2.步骤: <canvas id=&quo ...

  6. css_02之盒模型、渐变

    1.框模型:盒模型,①对象实际宽度=左右外边距+左右边框+左右内边距 + width:②对象实际高度=上下外边距+上下边框+上下内边距 + height: 2.外边距:margin:取值:①top(上 ...

  7. 易用BPM时代,软件开发者缘何选择H3?

    近年来,企业级软件开发市场暗流汹涌,呈现出多种态势.软件开发团队规模趋于小型化,工作方式趋于快捷化,超过半数的软件开发者在工作中会选择使用易用的软件开发工具.随着流程管理越来越受到企业的重视,流程开发 ...

  8. 使用git进行源代码管理

    git是一款非常流行的分布式版本控制系统,使用Local Repository追踪代码的修改,通过Push和Pull操作,将代码changes提交到Remote Repository,或从Remote ...

  9. 远程连接mysql 1130错误解决方法

  10. 纯JS打造比QQ空间更强大的图片浏览器-支持拖拽、缩放、过滤、缩略图等

    在线演示地址(打开网页后,点击商家图册): http://www.sport7.cn/cc/jiangnan/football5.html 先看一看效果图: 该图片浏览器实现的功能如下: 1. 鼠标滚 ...