在程序设计中为了达到“高内聚,低耦合”的要求,我们常常会引用接口,使一个接口作为两个类之间的媒介。那么接口是怎样解除两个类之间的耦合关系呢,解决的依据是什么?下面由我一一道来。
利用添加接口来解除耦合,还是利用了面向对象三大特性中的多态,因为多态的特性是父类或者接口的引用是可以接受子类对象。首先声明一个ITest接口,这个接口内有一个Say方法
interface ITest() //声明一个接口
{
void Say();
}
两个类Test1 和 Test2 分别实现此接口
public class Test1 : ITest
{
public void Say()
{
Console.WriteLine("Test1");
}
}
public class Test2 : ITest
{
public void Say()
{
Console.WriteLine("Test2");
}
}
在代码中耦合低可以体现在修改(删除)调用层接受层不受影响。比如我有一个方法SayName,将方法的参数类型设置为借口ITest类型。
public static void SayName(ITest test)
{
Console.WriteLine(test);
}
在调用时,就可以这样传递参数
static void Main(string[] args)
{
Test1 test1 = new Test1();
Test2 test2 = new Test2();
//无论传入类型是test1还是test2均可以达到预期效果,解除了依赖具体类的耦合
SayName(test1);
SayName(test2);
Console.ReadKey();
}
这样就达到了降低耦合的目的,SayName方法只需要接口类型,具体传入的是哪个对象无需关注,因为接口是一种抽象度更高的规则,SayName方法进来的参数一定是实现Test接口类的对象。即使将Test1与Test2两个类删除,ITest接口还在,那么SayName方法就可以继续使用,并且随意扩展一个新的类来实现Test接口。(也是设计模式中里氏代换原则的一个体现)同时还符合了依赖倒转原则(针对接口编程,依赖与抽象而不是具体类)这就可以实现多样性。
再举一个例子:比如统一用接口“动物”作为参数,统一调用“动物”的Say方法,但是传入的则是猪,狗,猫等不同的具体实例,那么Say的表现形式就不同了,但是你又不需要修改调用代码,因为是根据接口编程。