C#接口-接口作用

C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码,但没有真正认识到接口的作用的时候就觉得用接口是多此一举,当然你这样想那是绝对绝对错误的,比尔盖茨的微软请的员工都是比尔盖茨还聪明的人,他们的C#能添这样的多此一举吗?

可简单的这样理解接口:接口是方法的抽象,如果不同的类有同样的方法,那么就应该考虑使用接口。
例如,人和车都有“跑”的方法,那么就可以定义一个接口IRun
//注意,定义接口时,里面的方法不能有方法体
//应该在类里再去实现
//而具接口的成员全是公有的,不应有修饰符
Public interface IRun
{
void Run();
}

//人实现跑
Public class Person:IRun
{
Public Person()
{
.......
}

//以下是人对“跑"的具体实现
Public void Run()
{
Console.WriteLine("人用两脚跑");
}

}


//车实现跑
Public class Car:IRun
{
Public Car()
{
.......
}

//以下是车对“跑"的具体实现
Public void Run()
{
Console.WriteLine("车用四轮跑");
}
}

此外,一个类还可以实现多个接口,比如:人可以出声音、还可以跑,那么可以让人同时实现“跑”和“出声音”这两个接口。

我们定义一个接口
public interface IBark
{
   void Bark();
}
再定义一个类,继承于IBark,并且必需实现其中的Bark()方法
public class Dog:IBark
{
   public Dog()
   {}
   public void Bark()
   {
      Console.WriteLine("汪汪");
    }
}
然后,声明Dog的一个实例,并调用Bark()方法
     Dog 旺财=new Dog();
     旺财.Bark();
试想一下,若是想调用Bark()方法,只需要在Dog()中声明这样的一个方法不就行了吗,干什么还要用接口呢?因为接口中并没有Bark()具体实现,真的实现还是要在Dog()中,那么使用接口不是多此一举吗?

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

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

如果我们从设计的角度来看,一个项目中用若干个类需要去编写。由于这些类比较复杂,工作量比较大,这样每个类就需要占用一个工作人员进行编写。比如A程序员去定Dog类,B程序员去写Cat类,这两个类本来没什么联系的,可是由于用户需要他们都实现一个关于"叫"的方法,这就要对他们进行一种约束,让他们都继承于IBark接口,目的是方便统一管理,另一个是方便调用。当然了,不使用接口一样可以达到目的,只不过这样的话,这种约束就不那么明显,如果这样类还有Duck类等等,比较多的时候难免有人会漏掉这样方法,所以说还是通过接口更可靠一些,约束力更强一些。

转载于:https://www.cnblogs.com/tanding/archive/2012/06/27/2565097.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gpio的8种工作模式_Stm32之GPIO工作模式简介

GPIO的8种工作模式GPIO初始化结构体的时候,必须要配置合适的工作模式,这样才能使得IO口发挥应有的作用。工作模式大体上共分为输入输出两类,共8种,下面将介绍这8种工作模式。GPIO工作模式输入模式GPIO_Mode_AIN 模拟输入 GPIO_Mod…

vagrant,流浪汉,我又来啦。

最近学个DEVOPS2.0,讲微服务,容器华,持续部署,很到位,就一个一个工具撸一撸。。。 vagrant,以前接触过,所以上手快,,哈哈,,用时再具体配置。 virt…

dedecms最新版本修改任意管理员漏洞

此漏洞无视gpc转义,过80sec注入防御。 补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL? 起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆&#x…

第4章 Python 数字图像处理(DIP) - 频率域滤波10 - 使用低通频率域滤波器平滑图像 - 理想、高斯、巴特沃斯低通滤波器

目录使用低通频率域滤波器平滑图像理想低通滤波器(ILPF)高斯低通滤波器(GLPF)巴特沃斯低通滤波器低通滤波的例子使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 在以原点为中心的一个圆内无衰减地通过所有频率,而在这个圆外“截止”所有的频率的二维低通滤波…

vs2008中combox用法总结

1、判断是否为空 m_CheckPoint.GetCurSel()-1; 2、清空 m_CheckPoint.ResetContent(); 3、添加 m_CheckPoint.AddString(str); 4、获取某一索引的值 m_CheckPoint.GetLBText(j,str1);//j为索引,str1为存储变量 5、删除某一索引的值 m_CheckPoint.DeleteString(j);//…

bluecam连接步骤说明_厂家详解旋片式真空泵使用说明

旋片式真空泵是有区分单双极高速直联结构的真空泵,是用来对密封容器抽除气体的基本设备之一。旋片式真空泵的泵与电机连轴,有着高转速、外型小、结构紧凑、流动性工作方便的优点。本文所使用旋片式真空泵使用说明资料,是台冠真空泵技术团队工…

python函数中可变参数的传递方式是_Python函数可变参数定义及其参数传递方式实例详解...

本文实例讲述了Python函数可变参数定义及其参数传递方式。分享给大家供大家参考。具体分析如下: python中 函数不定参数的定义形式如下: 1、func(*args) 传入的参数为以元组形式存在args中,如: def func(*args): print args >&…

加载中做法

一个网页在加载时,可给静态部分加个加载中,而动态部分也即是真正内容用jq来改,这样就有那个效果了转载于:https://www.cnblogs.com/yedeying/p/3618815.html

Junit4常用注解

Junit4注解 JUnit4的测试类不用再继承TestCase类了。使用注解会方便很多。 Before:初始化方法After:释放资源Test:测试方法,在这里可以测试期望异常和超时时间Ignore:忽略的测试方法BeforeClass:针对所有测…

第4章 Python 数字图像处理(DIP) - 频率域滤波11 - 使用高通滤波器锐化图像

目录使用高通滤波器锐化图像由低通滤波器得到理想、高斯和巴特沃斯高通滤波器指纹增强频域中的拉普拉斯钝化掩蔽、高提升滤波和高频强调滤波同态滤波使用高通滤波器锐化图像 由低通滤波器得到理想、高斯和巴特沃斯高通滤波器 HHP(u,v)1−HLP(u,v)(4.118)H_{HP}(u, v) 1 - H_{…

值类型 引用类型 堆栈 堆 之 异想

看了很多值类型 和 引用类型的文章(谷歌能搜索出来的)看了越多疑问越大,而这些资料中没有具体的说明。问题:1、堆栈 和 堆 分别存于计算机的哪个硬件(CPU缓存,内存,硬盘)&#xff1f…

漫步者lollipods如何调节音量_漫步者MF5扩音器体验:老师值得入手

对于教师职业来说,保护好嗓子是很重要的。每天为学生操劳,频繁的讲课,很多老师都遇上了喉咙沙哑的问题。怎么样才能保护好老师的嗓子呢?“小蜜蜂”是很多老师们的选择,这种扩音器可以挂在腰间,通过麦克风&a…

数据库之间数据转换最快方法

用txt导入的方式是最快的,一般是秒级。 以ACCESS数据库到SQLite数据库为例: 第一步:导出ACCESS数据库到txt文件: 一、将表中数据导出到文本文件(TXT): Select * INTO [TEXT;DATABASEE:\TEMP].TE…

pandas删除某列有空值的行_Python-零基础学习Pandas知识点整理(2)

DataFrame数据的清洗--预处理操作import pandas as pdimport numpy as np#DataFrame数据框行或列的删除#df.drop(labelsNone,axis0,indexNone,columnsNone,levelNone,inplaceFalse,error"raise")#labels 表示需要删除的行或列的标签,多行或多列用列表传入…

JavaScript中的闭包

什么是闭包? 当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行的。下面用一些代码来解释这个定义: function foo() {var a 2;function bar() {console.log(a); // 2}bar(); }foo(); 这…

第4章 Python 数字图像处理(DIP) - 频率域滤波12 - 选择性滤波 - 带阻

目录选择性滤波带阻滤波器和带通滤波器陷波滤波器选择性滤波 处理特定的频带的滤波器称为频带滤波器 带阻滤波器: 若某个频带中的频率被滤除 带通滤波器: 若某个频带中的频率被通过 处理小频率矩形区域的滤波器称为陷波滤波器 陷波带阻滤波器&#x…

command line

对chrome 的IPC 感兴趣,想通过他的单元测试来窥探。 无意中看到有一个command_line 类,因为是第二次碰到 OSG中也有一个command类正好…

[物理学与PDEs]第1章第4节 电磁能量和电磁动量, 能量、动量守恒与转化定律 4.3 电磁能量 (动量) 密度, 电磁能量流 (动量流) 密度...

1. 电磁能量密度: $\cfrac{1}{2}\sex{\ve_0E^2\cfrac{1}{\mu_0}B^2}$. 2. 电磁能量流密度向量: ${\bf S}\cfrac{1}{\mu_0}{\bf E}\times {\bf B}$. 3. 电磁动量密度向量: $\cfrac{1}{c^2}{\bf S}$. 4. 电磁动量流密度张量: $\cfrac{1}{2}\sex{\ve_0E^2\cfrac{1}{\mu_0}B^2}{\bf…

python打包工具报错_python打包生成exe报错

如图所示 如果出现的是这个问题可以可以考虑以下方法 首先卸载原先下载的 Pyinstaller pip uninstall pyinstaller 再执行以下代码,去github上下载 pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip 注释:再次打包&#xff…

创建DLL、Lib以及使用DLL、Lib

1.要在生成DLL文件的同时生成Lib文件,函数声明时前面要加__declspec(dllexport)。 可在头文件中如下定义: #ifndef __MYDLL_H #define __MYDLL_H#ifdef MYDLL_EXPORTS #define MYDLL __declspec(dllexport) #else #define MYDLL __declspec(dllimport) #…