这次是C#中的接口
接口的出现,是为了解决C#中不允许多重继承的问题。
1、什么是接口?
我觉得可以把接口理解为对一组方法声明进行的统一命名,但这些方法没有提供任何实现。
通过接口,就可以对方法进行统一管理,避免了在每种类型中重复定义这些方法。
2、如何使用接口来编程
2.1 接口的定义
interface ICustomCompare
{
//定义比较方法,继承该接口的类都要实现该方法
int CompareTo(object other);
}
在接口中定义方法不能添加任何访问修饰符,因为接口中的方法默认是public,如果显示地指定了修饰符,则会出现编译时错误。也不能使用static关键字进行修饰。
在接口中除了可以定义方法外,还可以包含属性、事件、索引器,或者这4类成员(包括方法)类型的任意组合;但接口类型不能包含字段、运算符重载、实例构造函数和析构函数。
2.2 继承接口
public class Person:ICustomCompare
{
int age;
public int Age{get{return age;} set{age=value;}}
//实现接口方法
public int CompareTo(object value)
{
if(value==null)
{
return 1;
}
//将Object类型强制转换为Person类型
Person otherp=(Person)value;
//把当前对象的Age属性与需要比较的对象的Age属性进行对比
if(this.Age<otherp.Age)
{
return -1;
}
if(this.Age>otherp.Age)
{
return 1;
}
return 0;
}
}
在上面的的Person类中,实现了ICustomCompare接口中的CompareTo方法。
CompareTo方法会首先判断参数对象是否为null,如果为null,则直接返回1,代表当前对象比传入对象大。
如果对象不为空的话,强制转换成Person类型,对Age属性进行对比,当前对象的Age属性值比传入对象的Age属性值大,则返回1,如果返回-1,则说明当前对象的Age属性比传入的对象小。
2.3 调用接口中的方法
class Program
{
static void Main(string[] args)
{
Person p1=new Person();
p1.Age=18;
Person p2=new Person();
p2.Age=19;
//调用接口中方法,对p1和p2进行比较
if(p1.CompareTo(p2)>0)
{
Console.WriteLine("p1比p2大");
}
else if(p1.CompareTo(p2)<0)
{
Console.WriteLine("p1比p2小");
}
else
{
Console.WriteLine("p1比p2一样大");
}
Console.ReadKey();
}
}
3、显示接口实现方法
在上面的示例代码当中,使用了隐式的接口实现方式,即在实现代码中没有指定实现哪个接口中的CompareTo方法。
当然,也存在显式的接口实现方式,在类实现接口的过程中,明确指出实现哪一个接口中的哪一个方法。
interface IChineseGreeting
{
//方法声明
void SayHello();
}
interface IAmericanGreeting
{
//方法声明
void SayHello();
}
//Speaker类实现了两个接口
public class Speaker:IChineseGreeting,IAmericanGreeting
{
//隐式接口实现
public void SayHello()
{
Console.WriteLine("你好");
}
}
上面的Speaker类实现了两个接口,碰巧两个接口中声明的方法具有相同的返回类型、相同的方法名称和相同的参数。若采用隐式的接口实现方式,下面的代码将调用相同的SayHello方法。
static void Main(string[] args)
{
Speaker speaker=new Speaker();
//调用中国人打招呼方法
IChineseGreeting chinese=(IChineseGreeting)speaker;
chinese.SayHello();
//调用美国人招呼方法
IAmericanGreeting American=(IAmericanGreeting)speaker;
American.SayHello();
}
当Main函数执行的时候,得到的接口是两个 “你好”;
这并不是我们期望的结果,所以这种情况下,我们必须使用显式的接口实现方式来解决这个命名冲突问题。
//Speaker类实现了两个接口
public class Speaker:IChineseGreeting,IAmericanGreeting
{
//显式接口实现
void IChineseGreeting.SayHello()
{
Console.WriteLine("你好");
}
//显式接口实现
void IAmericanGreeting.SayHello()
{
Console.WriteLine("Hello");
}
}
使用这种方式就可以解决命名冲突问题。在使用显示的接口山西ian方式时,需要注意一下几个问题:
- 若显式实现接口,方法不能使用任何访问修饰符,显式实现的成员都默认为私有。
- 显式实现的成员默认是私有的,所以这些成员都不能通过类的对象进行访问。正确的调用方法是把speaker对象显式地转换成对应的接口,通过接口来调用SayHello方法。
针对以上的两种方式:显式实现和隐式实现,下面针对两种实现的区别和使用场景进行总结:
- 采用隐式接口实现时,类和接口都可以访问接口中的方法;而若采用显式接口实现方式,接口方法只能通过接口来完成访问,因此此时接口方法默认为私有。
- 当类实现单个接口时,通常使用隐式接口实现方式,这样类的对象可以直接去访问接口方法。
- 当类实现了多个接口,并且接口中包含相同的方法名称、参数和返回类型时,则应使用显式接口实现方式。即使没有相同的方法签名,在实现多个接口时,扔推荐使用显式的 方法,因为这样可以标识出哪个方法属于哪个接口。
4、接口与抽象类
这里主要是阐述一下两者的区别:
- 抽象类使用abstract关键字进行定义,而接口使用interface进行定义;他们都不能进行实例化。
- 抽象类中可以包含虚方法、非抽象方法和静态成员;但接口中不能包含虚方法和任何静态成员,并且接口中只能定义方法,不能有具体实现,方法的具体实现由实现类完成。
- 抽象类不能实现多继承,接口则支持多继承。注意,从严格意义上说,类接触接口应该成为类实现接口。
- 抽象类是对一类对象的抽象,继承于抽象类的类与抽象类为属于的关系;而类实现接口只是代表实现类具有接口声明的方法,是一种Can-DO的关系。所以一般接口后都带有able字段,表示“我能做”的意思。
上面的几点只是接口与抽象类之间差异的主要方法,它们还有很多的不同,大家可以参考一下别的书籍或者别的博客。
这次是C#中的接口的更多相关文章
- jmeter中测试接口
本文主要介绍在jmeter中测试接口:主要从以下几个方面进行说明: 1.jmeter简介 2.jmeter怎么做接口测试 3.jmeter进行参数化的几种形式 4.jmeter中处理乱码方法 5.jm ...
- MyBatis 中 Mapper 接口的使用原理
MyBatis 中 Mapper 接口的使用原理 MyBatis 3 推荐使用 Mapper 接口的方式来执行 xml 配置中的 SQL,用起来很方便,也很灵活.在方便之余,想了解一下这是如何实现的, ...
- 通过拦截器Interceptor实现Spring MVC中Controller接口访问信息的记录
java web工程项目使用了Spring+Spring MVC+Hibernate的结构,在Controller中的方法都是用于处理前端的访问信息,Controller通过调用Service进行业务 ...
- 【总结】浅谈JavaScript中的接口
一.什么是接口 接口是面向对象JavaScript程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...
- 介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图
这个教程是从UE4 Wiki上整理而来. 在C++中直接使用Interface大家应该很熟悉.只是简单先定义一个个有虚函数的基类,然后在子类中实现相应的虚函数.像这样的虚函数的基类一般概念上叫接口.那 ...
- Myeclipse中打开接口实现类的快捷键
Myeclipse中打开接口实现类的快捷键-----Ctrl + T Myeclipse中 Open Type快捷键-----Ctrl + Shift + T
- 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案
方案特点: 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案,简化软件开发流程,减少各应用系统相同模块的重复开发工作,提高系统稳定性和可靠性. 基于HTTP协议的开发接口 使用特点在网页 ...
- Android中的接口回调技术
Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James ...
- Spring中Ordered接口简介
目录 前言 Ordered接口介绍 Ordered接口在Spring中的使用 总结 前言 Spring中提供了一个Ordered接口.Ordered接口,顾名思义,就是用来排序的. Spring是一个 ...
随机推荐
- linux之cut用法
转载:http://www.cnblogs.com/dong008259/archive/2011/12/09/2282679.html cut是一个选取命令,就是将一段数据经过分析,取出我们想要的. ...
- 论SOA架构的几种主要开发方式【转】
面向服务架构soa以其独特的优势越来越受到企业的重视,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署.组合和使用.服务层是SOA的基础,可以直接被应用调用,从而有效控制系 ...
- Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路
2834: 回家的路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 62 Solved: 38[Submit][Status][Discuss] D ...
- JVM 的 工作原理,层次结构 以及 GC工作原理
JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM实现了Java语言最重要的特征:即平台无关性.原理:编译后的 ...
- 捕获 PHP 致命错误 Fatal Errors
register_shutdown_function()函数都将会你的程序执行完后执行,无论你的程是否运行正常. 所以,在这个函数前执行任何操作我们都要检查是否真的有致命错误出现.如果出现致命错误,我 ...
- Tomcat优化参数
JAVA_OPTS="-Xmx400m -Xms400m -XX:PermSize=128m -XX:MaxPermSize=400m -XX:+UseG1GC -XX:MaxGCPause ...
- 线程本地存储(Thread Local Storage, TLS)简单分析与使用
在多线程编程中, 同一个变量, 如果要让多个线程共享访问, 那么这个变量可以使用关键字volatile进行声明; 那么如果一个变量不想使多个线程共享访问, 那么该怎么办呢? 呵呵, 这个办法就是TLS ...
- Qss All
/* * OOMidi application style sheet */QFrame#transportToolButtons{border: 0;spacing: 0;margin: 0;pad ...
- 基于事件的 NIO 多线程服务器--转载
JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题,在 NIO 中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个 CPU 的处 ...
- 1个小时学会ReactiveCocoa基本使用
来源:朱凯奇 链接:http://www.jianshu.com/p/5d966074741a 1.ReactiveCocoa简介 ReactiveCocoa(简称为RAC),是由Github开源的一 ...