标签:
接口的出现,是为了解决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方式时,需要注意一下几个问题:
针对以上的两种方式:显式实现和隐式实现,下面针对两种实现的区别和使用场景进行总结:
4、接口与抽象类
这里主要是阐述一下两者的区别:
上面的几点只是接口与抽象类之间差异的主要方法,它们还有很多的不同,大家可以参考一下别的书籍或者别的博客。
标签:
原文地址:http://www.cnblogs.com/Helius/p/5348088.html