17.8 泛型接口
和泛型类一样,泛型接口在原接口定义的基础上,增加了类型参数,类型参数可用于定义接口成员的返回类型和成员方法的参数类型。
接下来,我们以一个泛型接口的代码为例,以对泛型接口进行说明。首先,定义一个泛型接口ILog<T>,这是一个日志接口,它有两个成员方法定义,分别是:
❑记录错误信息的error(T message)方法,参数为T类型;
❑返回当前错误信息的getCurrentMessage()方法,返回类型为T的值。
然后,定义一个泛型类Log<T>,它实现了接口ILog<T>,并提供了接口中所有成员定义的实现。最后,分别使用string和int类型实例化两个实例,如代码清单17-9所示。
代码清单17-9 泛型接口示例
1 namespace ProgrammingCSharp4
2{
3 class GenericsSample
4{
5 public static void Main()
6{
7 ILog<string>log1=new Log<string>();
8 ILog<int>log2=new Log<int>();
9
10 log1.error("hello world!");
11 log2.error(2010);
12}
13}
14
15 interface ILog<T>//泛型接口
16{
17 void error(T message);
18
19 T getCurrentMessage();
20}
21
22 class Log<T>:ILog<T>//泛型类,实现泛型接口
23{
24 private T_currentMessage;
25 public void error(T message)//实现泛型接口的方法
26{
27_currentMessage=message;
28 System.Console.WriteLine(message);
29}
30
31 public T getCurrentMessage()//实现泛型接口的方法
32{
33 return_currentMessage;
34}
35}
36}
上述代码的运行结果为:
hello world!
2010
现在我们看第7行代码:
ILog<string>log1=new Log<string>();
这里的类型实参是string类型,结合泛型接口ILog<T>的定义,其中的error方法的参数此时只能接受string类型的值参数,这一点,Visual Studio的IntelliSense功能也给予了相应提示,如图17-10所示。
图 17-10 Visual Studio的IntelliSense功能提示泛型接口中方法的参数类型
这说明,使用了不同类型实参的泛型接口是不同的接口,和实现两个不同的非泛型接口是一样的,如图17-11所示。
图 17-11 使用不同类型实参的接口是不同的接口
另外,不仅仅泛型类可以实现泛型接口,非泛型类也可以实现泛型接口,只是这时作为基类的泛型接口必须是封闭构造类型。也就是说它不能使用类型参数,而应该仅使用类型实参,如代码清单17-10所示。
代码清单17-10 非泛型类实现泛型接口
1 namespace ProgrammingCSharp4 2{
3 class GenericsSample
4{
5 public static void Main()
6{
7 ILog<int>log=new NumberLog();//实例化非泛型实现类
8 log.error(2010);
9}
10}
11
12 interface ILog<T>//泛型类型
13{
14 void error(T message);
15
16 T getCurrentMessage();
17
}
18
19 class NumberLog:ILog<int>//基类是封闭式构造类型
20
{
21 private int_currentMessage;//类型要和基类的类型实参一致
22 public void error(int message)
23{
24_currentMessage=message;
25 System.Console.WriteLine(message);
26}
27
28 public int getCurrentMessage()//类型要和基类的类型实参一致
29{
30 return_currentMessage;
31}
32}
33}
上述代码的运行结果如下:
2010