1.接口的声明

  接口的声明不能包含:数据成员,静态变量;只能包含如下类型的静态成员函数的声明:方法,属性,事件,索引器。声明中不能包含任何实现的代码,而在每个成员成名的主体后,必须使用分号。

  接口声明可以有任何的修饰符public、protect、internl或private。

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

 Public Interface IMyInterface
{
//接口成员是隐式的public,并且只有声明
int Method1(int nVar1,int nVar2) ;
}

2.接口的实现

  只有类和结构体才能实现接口,并且必须在基类列表中包括接口名称;使用接口的类或结构需要为接口的每一个成员提供实现。

 Class MyClass:IMyInterface
{
//在进行隐式的实现接口成员的时候,访问修饰符要设为public
public int Method(int a,int b)
{
Console.WriteLine("{0}",a+b);
return a+b;
}
}

  如果一个类即继承了基类,又实现了接口,那么在这个类的基类列表中的基类名称必须放在所有的接口的前面。并且一个类只能有一个基类,列出的其他类型必须都是接口名。

  接口不仅仅是类或结构要实现的成员列表,它是一个引用类型,我们不能直接通过类对象的成员访问接口,然而我们可以通过把类对象引用强制转换为接口类型来获取指向接口的引用。这样我们就可以使用点号来调用接口的方法了。这里转换推荐用as进行转换。

 Static void Main(string[] args)
{
int a = ;
int b = ;
MyClass mc = new MyClass();
//调用类对象的实现方法
mc.Method(a,b);
//将类型转化为接口类型
IMyInterface mif = mc as IMyInterface;
mif.Method(a,b);
}

输出结果:13

       13

利用as进行强制转换的好处:如果类实现了接口就会返回接口的引用(平安无事)如果类没有实现接口就会抛出异常,方便及时的发现错误。

3.实现多个接口

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

  所有实现的接口必须列在基类列表中且以逗号分隔。

  如果一个类实现的两个接口当中有重复的成员(具有相同的签名和相同的返回类型),那么在该类实现接口成员的时候,实现一次就可以满足所有包含重复成员的接口。

     interface interface1 { void Method(int a ,int b);}
interface interface2 { void Method(int a, int b);}
//实现多个接口用逗号相隔
public class MyClass : interface1, interface2
{
/*
* 如果两个接口成员函数的返回类型和参数一致,
* 那么进行一次实现就可以了
*/
public void Method(int a, int b)
{
Console.WriteLine("{0}", a + b);
}
}

  如果想刻意的分离这两个接口的接口成员,就需要创建显式的接口成员成员实现。格式:接口名称+点分隔符+接口的成员函数。注意:在显示的调用接口成员的时候,已经默认为public,不能再添加访问修饰符了。

     interface interface1 { void Method(int a ,int b);}
interface interface2 { void Method(int a, int b);}
//实现多个接口用逗号相隔
public class MyClass : interface1, interface2
{
//显示的实现interface1的接口成员
//已经默认为public,不能添加访问修饰符了
void interface1.Method(int a, int b)
{
Console.WriteLine("{0}", a + b);
}
void interface2.Method(int a, int b)
{
Console.WriteLine("{0}", a + b);
}
}

但是这样就只有显式接口成员的实现,而没有类级别的实现,所以在实例化该类的对象后,是无法点出该方法的。如果有显式接口成员实现,类级别的实现是允许的,但是不是必须的。并且显式接口成员实现智能通过指向接口的引用来访问,即使是类当中的成员函数来对接口成员进行访问。

如果一个类实现了接口,那么它的子类也会继承其基类实现的接口成员,无需再次实现。

4.接口的继承

要指定某个接口继承其他接口,应在接口声明中把接口以逗号分隔的列表形式放在接口名称之后。和类的继承格式相同。但是又与类不同,一个接口可以继承任意多个接口,可以进行多重继承。子接口除了包含自己声明的接口之外还包括所有父接口的所有接口成员。

5.代码Demo

 namespace ConsoleApplication2
{
interface ILoveWorld { void SayHello();}
class Creature{} //基类和接口同时实现的时候,基类要放在最前面
class Person : Creature,ILoveWorld
{
//隐式的声明接口,既可以被类的对象访问,又可以转换为接口引用对象访问
void SayHello()
{
Console.WriteLine("Hello World!");
}
//显式的声明接口成员,只能转换为接口引用对象来访问
void ILoveWorld.SayHello()
{
Console.WriteLine("Hello World!");
}
}
class Cat : Creature, ILoveWorld
{
//相对于显式的接口实现方式。类级别的接口实现不是必须的。
void ILoveWorld.SayHello()
{
Console.WriteLine("MiaoMiaoMiao");
}
}
class Dog : Creature, ILoveWorld
{
//在显式调用接口成员的时候不能用public
void ILoveWorld.SayHello()
{
Console.WriteLine("WangWangWang");
}
}
class Program
{
static void Main(string[] args)
{
//声明一个Creature的数组
Creature[] pCreatureArray = new Creature[];
//这里用到了上次学的面向对象的IS-A的关系
pCreatureArray[] = new Person();
pCreatureArray[] = new Cat();
pCreatureArray[] = new Dog();
foreach (var creature in pCreatureArray)
{
//利用as进行转换
ILoveWorld b = creature as ILoveWorld;
b.SayHello();
}
Console.ReadKey();
}
}
}

接口Demo

运行结果:

  

.net接口学习笔记的更多相关文章

  1. JMeter接口学习笔记2017

    协议学习地址:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html 本篇学习笔记来自于慕课网上学习JMeter的学习笔记 学习 ...

  2. PHP 开发 APP 接口 学习笔记与总结 - Redis 缓存

    Redis 可以定期将数据备份到磁盘中(持久化),同时不仅仅支持简单的key/value 类型的数据,同时还提供list,set,hash等数据结构的存储:Memcache 只是简单的key/valu ...

  3. thinkphp5开发restful-api接口 学习笔记一

    视频学习地址: http://study.163.com/course/courseMain.htm?courseId=1004171002 源码和文档(如果满意,欢迎 star): https:// ...

  4. 工程化编程实战callback接口学习笔记

    一.编译并运行 help.version命令执行正常,但quit命令出错 二.Debug 从命令输入到执行过程: 源代码: 更改后: 运行结果:能正确运行quit命令 Callback接口学习成果: ...

  5. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [3] 首页 APP 接口开发方案 ② 读取缓存方式

    以静态缓存为例. 修改 file.php line:11 去掉 path 参数(方便),加上缓存时间参数: public function cacheData($k,$v = '',$cacheTim ...

  6. OpenCV(C++接口)学习笔记1-图像读取、显示、保存

    OpenCV在2.0加入版本号之后C++接口函数,学习前C语言的接口功能.现在OpenCV它已被发展到2.4.9版本号,所以,我决定学习C++接口函数,与步伐. 1.创建图像 cv::Mat imag ...

  7. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [6] 版本升级接口开发

    判定 app 是否需要加密:通过 app 表中的 status 字段来判定,加密的字符串为 app 表中的 key 字段. 在获取的客户端和服务器端(数据库表中相应字段)的版本号不一致时,返回 dat ...

  8. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [5] 版本设计分析及数据表设计

    APP 版本升级以及 APP 演示 ① 版本升级分析以及数据表设计 ② 版本升级接口开发以及 APP 演示 /** * version_upgrade 版本升级信息表 */ CREATE TABLE ...

  9. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [4] 首页 APP 接口开发方案 ③ 定时读取缓存方式

    用于 linux 执行 crontab 命令生成缓存的文件 crop.php <?php //让crontab 定时执行的脚本程序 require_once 'db.php'; require_ ...

随机推荐

  1. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。

    import java.util.Scanner; /** * 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字. * 2+22+222+2222+22222(此时共有5个数 ...

  2. Difference between LET and LET* in Common LISP

    Difference between LET and LET* in Common LISP   LET   Parallel binding which means the bindings com ...

  3. JVM 参数翻译汉化解释

    博客搬家,新地址:http://www.zicheng.net/article/38.htm Behavioral Options(行为参数) Option and Default Value Des ...

  4. 上海华魏光纤传感科技有限公司 招聘 《.NET研发工程师》

    代友招聘 <.NET研发工程师> **** 公司简介 **** 上海华魏光纤传感技术有限公司成立于2001年,注册资金1458.16万人民币,专业从事光纤传感技术的研究开发,为交通.市政等 ...

  5. 关于Task类处理多线程简单示例

    1.定义一个线程 var task1 = Task.Factory.StartNew(() => DoSomeWork()):方法如下:          private static obje ...

  6. 自动化测试管理平台ATMS(V2.0.3_8.28)下载

    自动化测试管理平台ATMS(V2.0.3_8.28)下载http://automationqa.com/forum.php?mod=viewthread&tid=2845

  7. Python Flask UnicodeDecodeError 编码错误解决

    折腾Python做快速Web开发.最后定下来用Flask,相对教程全面. utf8编码上遇到问题,所有文件已经是utf8编码保存,加载css.js等静态文件,如果用GBK编码就正常:用utf8就报Un ...

  8. Ubuntu 16.04 LTS更新

    Canonical今天正式发布了新版的Ubuntu系统,针对PC.笔记本.上网本.平板和智能手机各类设备.这次的Ubuntu 16.04代号为Xenial Xerus——这个代号是由Canonical ...

  9. WinFrom 登录窗体 密码保存效果

    WinFrom 登录窗体 保存密码效果 开发CS程序的程序员都会遇到 今天突然想把这个功能加到我的项目中 之后总结下 不多说 上图   如果关闭程序 下次在登录的时候 用户名.密码会自动保留下来  一 ...

  10. 免费国内外"代码托管服务器"收集

      国内 开源中国  http://git.oschina.net/  支持git 淘宝code  http://code.taobao.org/  支持svn 京东code  https://cod ...