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. XML 文档和数据

    .NET Framework 4.5 其他版本 .NET Framework 提供了一组全面而集成的类,可用来方便地生成可以识别 XML 的应用程序. 通过以下命名空间中的类,可以分析和编写 XML, ...

  2. ECSHOP后台SQL查询提示错误 this sql May contain UPDATE,DELETE,TRUNCATE,ALTER,DROP,FLUSH,INSERT

    一).首先说一下错误现象:市面上流行的绝大部分ECSHOP模板,安装的时候都需要执行一段或几段SQL语句来修改数据结构或者初始化一些数据.大多数ECSHOP管理员为了省事,都会通过 “ECSHOP后台 ...

  3. Android杂谈--小知识点总结(1)

    此知识点总结是开发过程中遇到的比较棘手或者恶心的地方,所以随时更新,以备不时之需 1. viewFlipper中的item如何动态设置高度? 例如: <ViewFlipper android:l ...

  4. SQL Server Profiler:使用方法和指标说明

    SQL Server Profiler的中文意思是SQL Server事件探查,一个Sql的监视工具,可以具体到每一行Sql语句,每一次操作,和每一次的连接.感觉这个工具的作用还是很大的,给大家分享一 ...

  5. [原]OpenGL基础教程(五)缓冲区数据更新方式

    1.glBufferSubData 适用于相同数据类型 void SetPositionY(float y){    vector<Vector3<float>>::itera ...

  6. 【转】如何判断Javascript对象是否存在

    Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言描述的算法如下: ...

  7. C8051 SMBus 原理

    一.SMBus总线   SMBus串行I/O接口完全符合系统管理总线规范 1.1 版.它是一个双线的双向串行总线,与I2C串行总线兼容.系统控制器对总线的读写操作都是以字节为单位的,由SMBus接口自 ...

  8. mem_fun 例子

    // functional_mem_fun.cpp // compile with: /EHsc #include <vector> #include <functional> ...

  9. 【软件分析与挖掘】Multiple kernel ensemble learning for software defect prediction

    摘要: 利用软件中的历史缺陷数据来建立分类器,进行软件缺陷的检测. 多核学习(Multiple kernel learning):把历史缺陷数据映射到高维特征空间,使得数据能够更好地表达: 集成学习( ...

  10. Logcat 不显示日志的另一个原因. 跟cocos2dx关系不大.

    在Android真机调试时,如果在eclipse中看不到LogCat信息,提示是: $ adb logcat info: log device is empty! 原因是系统默认关闭了log,需要将其 ...