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. Eclipse无法启动报An internal error occurred during: "reload maven project". java.lang.NullPointerException

    由于没有正常关机导致eclipse无法将数据正常写入配置文件导致无法启动.报这样一个异常 An internal error occurred during: "reload maven p ...

  2. 理解netty对protocol buffers的编码解码

    一,netty+protocol buffers简要说明 Netty是业界最流行的NIO框架之一优点:1)API使用简单,开发门槛低:2)功能强大,预置了多种编解码功能,支持多种主流协议:3)定制能力 ...

  3. apache 配置反向代理服务器

    前几天实验了下 nginx 配置反向代理服务器.虽然 nginx 的安装很麻烦,但是用起来倒是很简单.不过组里没人用过 nginx,apache 服务器大家倒是蛮熟,为了减少 ops team 的工作 ...

  4. cocos2dx的lua绑定

    一.cocos2dx对tolua++绑定的修正 A.c对lua回调函数的引用 在使用cocos2dx编写游戏时,我们经常会设置一些回调函数(时钟.菜单选择等).如果采用脚本方式编写游戏的话,这些回调函 ...

  5. C primer plus 练习题 第三章

    5. #include <stdio.h> int main() { float you_sec; printf("请输入你的年龄:"); scanf("%f ...

  6. Swift 集合类型

     Swift语言提供数组和字典的集合类型  Swift 语言里的数组和字典中存储的数据值类型必须明确 ,即数组中只能存放同类型的数据. 1: 数组 数组的创建 var shoppingList: St ...

  7. UNIX环境高级编程笔记之高级I/O

    本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 readv和writev函数,以及存储映射I/O ...

  8. MSIL解析一(转)

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/15/857140.html 在网上发现了一个非常好的MSIL教程,可惜是英文版的,于是就翻译了 ...

  9. 转载 jQuery的三种$()

    $号是jQuery“类”的一个别称,$()构造了一个jQuery对象.所以,“$()”可以叫做jQuery的构造函数(个人观点,呵呵!).   1.$()可以是$(expresion),即css选择器 ...

  10. Qt 添加资源文件

    *本人乃小白,博文主要用于个人记录,不保证内容准确无误* 我们编写的gui可能需要一些额外的资源(比如贴图用的图片),可用资源文件统一管理.以下以图片为例. 用qt creator 打开工程,为工程新 ...