Live软件开发面面谈
上QQ阅读APP看书,第一时间看更新

1.1 使用接口编程

先来看看在用Java、C#这样的面向对象语言编程时,经常被提倡的尽量使用接口的理念。在用继承基类和实现接口构建的类型层次体系中,越往上的类型越一般和抽象,越往下的类型越具体和多功能。在定义变量时,无论是类字段、方法变量,还是方法的参数和返回值,都尽可能使用抽象的类型。例如Java语言只支持单个基类,类型的大量抽象继承均以接口的方式体现,导致在一个类的层次体系的高层,接口往往比类多,所以尽可能使用的抽象类型就以接口居多,这也就是所谓的使用接口编程。例如下面的C#代码。

在以ConcreteClass结尾的两个方法中,使用的是具体的类型Hashtable;而在以Interface结尾的两个方法中,使用的是抽象的接口IDictionary。使用接口的好处是,对于DeclareAndReturnInterface方法,将来如果基于业务逻辑或性能的考虑,觉得应该采用另一个更合适的实现IDictionary的类,如SortedList,只需要把dict变量初始化成一个SortedList,后面的代码和返回的类型丝毫不受影响,因而对调用方是透明的;对于PassInterface方法,能够接受任何实现了IDictionary接口的参数,调用方传入的具体类型发生变动不会影响该方法的运作。简言之,就是使用的类型越一般,代码的应用范围越广,适应性越好。当然,应该是尽可能一般,而不是无条件的最一般。所谓可能,就是指该类型的接口能够满足使用者的需求。例如,在上面的例子中不能使用比IDictionary更一般的接口ICollection,因为它没有Add方法。