一个应用程序首先需要定义角色,然后抽象出关于这个角色的方法,把他们放在一个接口中,可以很好的降低程序之间的耦合性。
接口当然是不能实体化的了,因为他没有构造器,但是却可以声明它为一个引用,让它去指向某个和他类型相同即已经实现了该接口方法的对象。比如ITeacher t;这个t相当于委托的作用,委托到一个属性或者方法,到底是哪个方法,就要看之前声明的是哪个对象,接口变量实现的是这个对象的方法。
如果一个类实现多个接口,它的对象就有能力扮演应用程序中的多种身份或角色,比如说有一个接口ITeacher,另一个IAdministrator.一个类Professor实现了这2个接口,也就是说一个教授有可能是教师有可能是领导。
不用接口的例子:不用接口的例子:
public class Course
{
private professor teachingAssistant;
public professor TeachingAssistant
{
get{return teachingAssistant;}
set{teachingAssistant = value;}
}
}
客户代码:
Course c = new Course("math");
Professor p = new Professor("zhoulu");
c.TeachingAssistant = p;//把助教指定为zhoulu
假如我想把Professor改为Student,那么就要改动很多代码,几乎要重写。现在来看看用接口实现的方式。
public class Course
{
private ITeacher teachingAssistant;
public ITeacher TeachingAssistant
{
get{ return teachingAssistant;}
set{teachingAssistant = value;}
}
}
Interface ITeacher
{
void bool AgreeToTeach(Course c);
void Designate Textbook(TextBook b,Course c);
}
//客户代码如下:
Course c = new Course("math");
Professor p = new Professor("zhoulu");
c.TeachingAssistant = p;
p.AgreeToTeach();
现在我想把Professor改为Student,只要修改2行代码:实体化Student类,接口变量委托给TeachingAssisant
Student s = new Student("miaofang");
c.TeachingAssistant = s;
可见接口的威力是多么巨大,这里快速的响应需求变化,只需要改客户代码就可以了。因为类都实现了该接口,所以接口变量(委托)就可以根据具体指向哪个对象来套用那个对象的方法。非常重要的一个思想。
在.net Framework中,有一个接口IList,所有的集合类都实现了这个接口,那么我们就可以把IList list当作某个方法的参数,用类似的方法去看具体是操作那个的对象,使ArrayList,or HashTable。
public class class1
{
....
public void Method(IList list)
{
//指定时操作那个对象
}
}