一、实现泛型接口
像类和结构一样,接口也可以根据泛型类型参数来定义。泛型接口提供所有基于接口编程的优点,而且不会带来类型安全,性能或者开发上的损失。当要实现一个泛型接口时,必须提供一个特定类型参数用来代替泛型类型参数,例如:
public interface IList<T>
{
void AddHead(T item);
void RemoveHead(T item);
void RemoveAll();
}
public class NumberList : IList<int>
{
public void AddHead(int item)
{...}
public void RemoveHead(int item)
{...}
public void RemoveAll()
{...}
}
泛型接口一旦定义了一个抽象服务,则可以通过多个类型参数在多个组件中使用。例如,一个基于Int的List可以实现IList<T>,一个基于String的List同样可以实现:
public class NumberList : IList<int>
{...}
public class NameList : IList<string>
{...}
一旦泛型接口被绑定(指被使用特定类型定义),它就被认为是一个独特的类型。所以,两个被不同泛型类型参数定义的泛型接口不再相互具有多态性。这就意味着一个IList<int>类型的变量就不能被当作一个IList<string>类型的参数来调用:
void ProcessList(IList<string> names)
{...}
List<int> numbers=new NumberList();
ProcessList(numbers); //不会通过编译
如果要保证在泛型参数类型限定下接口的使用,可以通过泛型接口来维护多态性:
public class ListClient<T>
{
public void ProcessList(IList<T> list)
{...}
}
IList<int> numbers = new NumberList();
IList<string> names = new NameList();
ListClient<int> numbersClient = new ListClient<int>();
ListClient<string> namesClient = new ListClient<string>();
numbersClient.ProcessList(numbers);
namesClient.ProcessList(names);
二、继承泛型接口的子接口和子类
当一个接口继承自一个泛型接口时,就需要决定如何定义子接口。常用做法是把子接口也定义成泛型接口并提供与父接口相同的泛型类型参数:
public interface IBaseInterface<T>
{
void MethodA(T t);
}
public interface ISubInterface<T> : IBaseInterface<T>
{
void MethodB(T t);
}
也可以给父接口指定一个具体的类型,使子接口成为非泛型接口:
public interface ISubInterface : IBaseInterface<string>
{
void MethodB();
}
当继承于泛型接口时,可以在泛型类中应用同样的做法,让客户端决定使用具体的类型参数。这是定义具体类型的一个选择,它不会限制子类对于具体类型参数的使用:
public class List<T> : IList<T>
{
public void AddHead(T item)
{...}
public void RemoveHead(T item)
{...}
public void RemoveAll()
{...}
}
IList<int> numbers = new List<int>();
IList<string> names = new List<string>();
当一个泛型类或一个泛型接口继承于一个泛型接口时,不能指定多个裸露的泛型类型:
//不会通过编译
{...}
当指定为同一类型时就成了一体接口,这违反了接口的独特性(就是重复继承于一个接口了@_@)。如果这样做被允许,编译器将不会知道如何解析像以下这样的定义:
List<int,int> list;
接口与泛型部分很多,待个续吧。。。
根据原版英文翻译总结的,所以不足和错误之处请大家不吝指正,谢谢:)