下面一段代码用于判断某个输入值是否落在最大值和最小值的区间范围内,如果是就返回这个输入值,否则返回控件原来的值.
输入值可能有两种类型(int或float),
我想如果是像Python这样的弱类型语言,解释器应该可以自动推断出变量类型,直接写一次比较逻辑的代码就可以了.
但是像C/C++, C#/Java这样的强类型语言,因为比较操作涉及的变量类型不同,如果不使用泛型的话,就要为每种类型各写一遍比较逻辑代码.
代码如下,除了类型不一样,上下两种类型的处理逻辑是一模一样的.
要消除这种代码重复,就要用到泛型.平时在实际中用到的也不多,正好借这个机会复习一下.
决定采用泛型方法(还有泛型类,泛型接口,泛型代理等),把重复的比较逻辑代码提出到共通的泛型方法中去,具体的变量类型作为参数传递.
代码如下:
<T>跟在方法名的后面表示类型的占位符, 后面参数列表中对应的参数类型用T替代.
但是直接这样写还不行,有编译error,因为代码用到了变量对象的比较操作.而此时在泛型方法内编译器并不知道如何比较两个T类型变量对象.
所以还要额外指明类型T的约束条件,也就是让编译器知道:类型T的变量实现了IComparable<T>接口.
这样编译器就知道T类型的变量可以用.CompareTo方法来比较大小.
而int,float显然都是实现了这个接口的类型.
于是借这个机会又复习了一下接口的概念.
其实我本来以为实现了IComparable<T>接口就可以直接用大于号小于号比较大小了(运算符重载).
然而实际上并不是,还是得调用.CompareTo方法才能比较大小.
泛型的类型约束用where子句表示, 代码如下:
将比较逻辑提出到泛型方法中以后,原来的代码如下:
虽然用了泛型,但还是要先判断变量的类型,再分别调用两次.
因为泛型方法只是声明,在实际调用的时候,编译器实际上还是要根据传入的实际类型分别构造出两个不同参数类型的方法.
Python应该不会遇到这种问题吧?应该直接写一次相关的逻辑处理代码就可以了.
但是我还没实际动手试一下,回去有时间试一下.如果不出所料果真如此的话.
那Python一直以来宣传的简洁优雅的优点,我之前却一直都没怎么看出来(相较于C#),现在看至少在这个问题上,确实也还是有一定道理的.