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.8 泛型接口 - 图1

图 17-10 Visual Studio的IntelliSense功能提示泛型接口中方法的参数类型

这说明,使用了不同类型实参的泛型接口是不同的接口,和实现两个不同的非泛型接口是一样的,如图17-11所示。

17.8 泛型接口 - 图2

图 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