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. OllyICE 调试的程序无法处理异常 解决方法

    问题描述 在用OllyICE打开可执行文件时出现如下图所示错误 解决方法 1. 选项 -> 调试设置 , 打开调试选项 2. 切换到 异常 页签 3. 取消勾选 忽略(传递给程序)以下异常: 单 ...

  2. [PaPaPa][需求说明书][V1.0]

    前   言 嘿嘿!嘿嘿!嘿嘿嘿嘿!大家好,我是XXX! 经过30K大大几篇文章在博客园怒刷存在感之后,咱们的小群瞬间从70人的数量增加到了将近400人.一下子加进来这么多人我还真是有点不适应啊! 我知 ...

  3. RadioButton 的background属性表现特征

    对于radiaoButton,应该很多人都用过.下面看一个场景     上方时radiogroup,细致观察发现左1,文字开始位置和右1文字开始位置不同,这是为何呢? 查看布局: <RadioB ...

  4. 华为手机连不上adb解决方法

    1.关闭qq,豌豆荚等一连接usb自动侦测手机的程序... 2.安装hisuite软件,这个应该跟相应的版本有关,新版本最好要安装这个软件,否则也可能导致怎么都连接不上 3.打开usb调试功能 4.a ...

  5. WPA字典锦集

    1.xiemimendictionary 字典下载(第二季),500W整理过后还有282W条不重复的密码 字典下载,600W整理过后还有400W条不重复的密码 历次泄+常用弱口令字典集合[无中文去重复 ...

  6. 构造Lambda表达式

    /// <summary> /// 构造Lambda表达式 /// </summary> /// <typeparam name="T">< ...

  7. [Linux] 查看系统启动时间

    查找系统最后启动时间 1. 使用 who 命令 who -b 输出: system boot 2015-10-14 00:51 2. 使用 last 命令 last reboot | head -1 ...

  8. @media 手机与IPAD与PC

    @media screen and (min-width: 769px) { bindCard{height:28.5em} } @media screen and (min-device-width ...

  9. Knockout 新版应用开发教程之Observable Arrays

    假如你想到侦测和相应一个对象的改变,假如你想要侦测和响应一一组合集的改变,就要用observableArray 在许多场景都是很有用的,比如你要在UI上需要显示/编辑的一个列表数据集合,然后对集合进行 ...

  10. apple Swift教程大全,希望对你有帮助!

    1)apple Swift编程入门文档- http://gashero.iteye.com/blog/2075324 一位大神写的关于Swift的一些介绍和简单的使用,里面介绍了Swift和其他语言的 ...