原文出处: 指尖流淌-吴学雷

1、C#接口的作用
C# 接口是一个让很多C#初学者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码。

没有真正认识到接口的作用的时候就觉得用接口是多此一举。

当然你这样想那是绝对绝对错误的,比尔盖茨的微软请的员工都是比盖茨还聪明的人,他们的C#能添这样的多足吗?!关于接口的作用,网上有一位就真的深入浅出给我们做了很好理解的分析。

我们定义一个接口:

public interface IBark
{void Bark();
}

再定义一个类,继承于IBark,并且必需实现其中的Bark()方法

public class Dog:IBark
{public Dog(){}public void Bark(){Consol.write("汪汪");}
}

然后,声明Dog的一个实例,并调用Bark()方法

Dog 旺财=new Dog();
旺财.Bark();

试想一样:
若是想调用Bark()方法,只需要在Dog()中声明这样的一个方法不就行了吗,干什么还要用接口呢?
因为接口中并没有Bark()具体实现.真的实现还是要在Dog()中.那么使用接口不是多此一举吗?

还有人是这样说的:从接口的定义方面来说,接口其实就是类和类之间的一种协定,一种约束.还拿上面的例子来说.所有继承了IBark接口的类中必需实现Bark()方法.那么从用户(使用类的用户)的角度来说,如果他知道了某个类是继承于IBark接口,那么他就可以放心大胆的调用Bark()方法,而不用管Bark()方法具体是如何实现的.比如,我们另外写了一个类。

public class Cat:IBark
{public Cat(){}public void Bark(){Consol.write("喵喵");}
}

当用户用到Cat类或是Dog类的时候,知道他们继承于IBark,那么不用管类里的具体实现,而就可以直接调用Bark()方法,因为这两个类中肯定有关于Bark()方法的具体实现.

如果我们从设计的角度来看.一个项目中用若干个类需要去编写,由于这些类比较复杂,工作量比较大,这样每个类就需要占用一个工作人员进行编写.比如A程序员去定Dog类,B程序员去写Cat类.

这两个类本来没什么联系的,可是由于用户需要他们都实现一个关于”叫”的方法.

这就要对他们进行一种约束,让他们都继承于IBark接口。

目的是方便统一管理.另一个是方便调用。

当然了,不使用接口一样可以达到目的。只不过这样的话,这种约束就不那么明显。

如果这样类还有Duck类等等,比较多的时候难免有人会漏掉这样方法.所以说还是通过接口更可靠一些,约束力更强一些。

2、C#中接口的深入浅出:

通过学习对C#中接口的作用有了更进一步的理解,拿出来跟大家分享一下,有说的不对的地方请大家指教。

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

class clsVBProgramer
{public void WriteCode(){Console.WriteLine("用VB写程序的程序员");}
}class clsDelphiProgramer
{public void WriteCode(){Console.WriteLine("用Delphi写程序的程序员");}
}class Program
{public void WritePrograme(clsVBProgramer programer)//用VB写代码{programer.WriteCode();}public void WritePrograme(clsDelphiProgramer programer)//重载方法,用Delphi写代码{programer.WriteCode();}static void Main(string[] args){Program proj = new Program();//如果需要用VB写代码clsVBProgramer programer1 = new clsVBProgramer();proj.WritePrograme(programer1);//如果需要用Delphi写代码clsDelphiProgramer programer2 = new clsDelphiProgramer();proj.WritePrograme(programer2);}
}

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

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

interface IProgramer
{void WriteCode();
}class clsVBProgramer : IProgramer
{public void WriteCode(){Console.WriteLine("用VB写程序的程序员");}
}class clsDelphiProgramer : IProgramer
{public void WriteCode(){Console.WriteLine("用Delphi写程序的程序员");}
}class Program
{public void WritePrograme(IProgramer programer){programer.WriteCode();}static void Main(string[] args){Program prog = new Program();IProgramer programer;programer = new clsVBProgramer();prog.WritePrograme(programer);programer = new clsDelphiProgramer();prog.WritePrograme(programer);}
}

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

另外我们如果把Program这个类封成一个组件,那么当我们的用户需要要扩充功能的时候,我们只需要在外部做很小的修改就能实现,可以说根本就用不着改动我们已经封好组件!是不是很方便,很强大。

C#接口作用的深入理解相关推荐

  1. Java中接口作用的理解

    关于Java中接口作用的深入理解.这是个很容易遇到的问题吧,看下面红色的部分应该就能理解了.要把接口视作一种共同规范. / 2019/3/1 补充 : 接口的存在也是为了弥补类无法多继承的缺点,假设一 ...

  2. 【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁

    上两篇文章我们初步接触了ABI-应用程序二进制接口的概念,点击链接查看上一篇文章:[软件开发底层知识修炼]二十二 ABI-应用程序二进制接口 二.了解了为什么会有ABI的存在.本篇文章继续学习ABI ...

  3. 接口(Interface)的深入理解

    接口(Interface)的深入理解 一:接口是规范(不展开) 二:接口可以看成是一个特殊的类 1: 接口可以定义"接口类型变量",就好像类可以定义类类型的变量(或者说是引用类型变 ...

  4. C#接口(Interface)理解

    文章目录 C#接口(Interface)理解 C#接口(Interface)理解 接口定义了所有类继承接口时应遵循的语法合同. 接口定义了语法合同 "是什么" 部分,派生类定义了语 ...

  5. .class与.java_Java中Class类的作用与深入理解

    Java中Class类的作用与深入理解 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.JVM利用运行时信息选择相应的方法执行.而保存 ...

  6. 对面向过程,对象,接口,切面的理解

    我对面向过程,对象,接口,切面的理解 --模范青蛙 1.面向过程 面向过程是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法.它考虑的是实际地实现.一 ...

  7. Comparable接口作用

    今天在开发中无意看到Integer包装类内部实现了Comparable接口,因此探查一下该接口作用: 查看API解释: 此接口强行对实现它的每个类的对象进行整体排序.这种排序被称为类的自然排序,类的 ...

  8. OBD接口作用和针脚定义图解

    OBD接口作用和针脚定义图解 车辆OBD接口,连接车辆ECU行车电脑的接口,检修车辆时把设备解码仪插在此接口,进行扫描车辆是否有故障及故障代码,以后的车联网都是基于此口加以研发的. 什么是OBD OB ...

  9. Cloneable接口的作用与深入理解深度克隆与浅度克隆

    cloneable接口的作用 cloneable其实就是一个标记接口,只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则 ...

最新文章

  1. Ubuntu Server中怎样卸载keepalived
  2. 怎么避免后台被搜索_复星保德信人寿保险有限公司星满意重大疾病保险怎么样?好不好?可信/靠谱吗?有什么优缺点/注意事项?值不值得买?一年多少钱?...
  3. 旧金山字体_旧金山建筑业的兴衰。 施工趋势与历史
  4. 如何解决Office 2010安装报错1907,没有足够权限注册字体?
  5. java中 resource_Java中如何获取resource的源码分析
  6. Understand源代码分析工具
  7. dreamweaver 正则表达式为属性值加上双引号_IT兄弟连 HTML5教程 HTML5表单 新增的表单属性3...
  8. 计算机基础应用课件,计算机应用基础教程(全套课件).ppt
  9. Python语言概述
  10. 36D杯CTF Re WP
  11. A3文件转换成A4文件
  12. 占领电商细分领域高地的湖南,在产业互联网时代该如何入海?
  13. vue实现当前组件重新加载
  14. python与分形0017 - 【教程】彩色色阶蛛网
  15. 请教求助,打开U盘显示,你当前无权访问该文件夹。
  16. 服务器客户端传输文件,服务器传输文件到客户端
  17. opencv--图像色彩和对比度
  18. MySQL InnoDB Cluster部署
  19. WebGL实时视频(5) awrtc.js理解并修改
  20. docker-compose up和restart的区别

热门文章

  1. 微信测试公众号如何测试菜单
  2. 成都python工作-成都python工资收入多少
  3. NowCoder Wannafly 27E 黄魔法师 构造
  4. Feign、OpenFeign及SpringCloud Feign的区别
  5. c语言cstdio什么意思,iostream与cstdio有什么区别?
  6. WPF界面开发第三方控件入门指南——菜单项
  7. 陆续升级HarmonyOS,今年4月起华为旗舰手机将陆续升级鸿蒙HarmonyOS操作系统
  8. 一套实用的渗透测试岗位面试题
  9. JQuery鼠标移到图片改变,移出图片恢复原来图片
  10. [转帖]GNU/Linux与开源文化的那些人和事