9.5 参数和返回类型的设计规范
声明方法的参数类型,应尽量指定最弱的类型,宁愿要接口也不要基类。
例如写方法来处理一组数据项,最好用接口,比如IEnumerable<T>声明参数,而不要用强数据类型,比如List<T>或者更强的接口类型,比如ICollection<T>或IList<T>
public void ManipulateItems<T>(IEnumerable<T> collection){}
原因是调用第一个方法时可以传递数组对象、List<T>对象、String对象或者其他对象——只要对象的类型实现了IEnumerbale<T>接口。相反,第二个方法只允许传递List<T>对象。
当然,如果方法需要的是列表,而非任何可枚举的对象,就应该将参数声明为IList<T>。但仍然要避免将参数类型声明为List<T>。
注意
这里的例子讨论的是集合,是用接口体系来设计的。讨论使用基类体系接口设计的类时,概念同样适用。
参数声明选择最弱的返回类型
例如对流中的字节进行处理的方法,可定义为以下方法。
public void ProcessBytes(Stream someStream){}
这个方法能处理任何流,包括FileStream、NetworkStream和MemoryStream等。
方法返回类型声明为最强的返回类型
相反,一般最好是将方法的返回类型声明为最强的类型,防止受限于特定类型
public FileStream OpenFile(){}
它允许方法的调用者将返回对象视为FileStream对象或者Stream对象。
需要修改方法内部实现选择较弱返回类型
在不影响调用者的前提下修改方法的内部实现,前面的例子中,OpenFile方法不他可能更改内部实现来返回除FileStream之外的其他对象。
如果想保持一定灵活性,在将来更改方法返回的东西,请选择一个较弱的返回类型
public IList<String> GetStringCollection(){}