下面一段代碼用于判斷某個輸入值是否落在最大值和最小值的區(qū)間范圍內(nèi),如果是就返回這個輸入值,否則返回控件原來的值.
輸入值可能有兩種類型(int或float),
我想如果是像Python這樣的弱類型語言,解釋器應(yīng)該可以自動推斷出變量類型,直接寫一次比較邏輯的代碼就可以了.
但是像C/C++, C#/Java這樣的強類型語言,因為比較操作涉及的變量類型不同,如果不使用泛型的話,就要為每種類型各寫一遍比較邏輯代碼.
代碼如下,除了類型不一樣,上下兩種類型的處理邏輯是一模一樣的.
要消除這種代碼重復(fù),就要用到泛型.平時在實際中用到的也不多,正好借這個機會復(fù)習(xí)一下.
決定采用泛型方法(還有泛型類,泛型接口,泛型代理等),把重復(fù)的比較邏輯代碼提出到共通的泛型方法中去,具體的變量類型作為參數(shù)傳遞.
代碼如下:
<T>跟在方法名的后面表示類型的占位符, 后面參數(shù)列表中對應(yīng)的參數(shù)類型用T替代.
但是直接這樣寫還不行,有編譯error,因為代碼用到了變量對象的比較操作.而此時在泛型方法內(nèi)編譯器并不知道如何比較兩個T類型變量對象.
所以還要額外指明類型T的約束條件,也就是讓編譯器知道:類型T的變量實現(xiàn)了IComparable<T>接口.
這樣編譯器就知道T類型的變量可以用.CompareTo方法來比較大小.
而int,float顯然都是實現(xiàn)了這個接口的類型.
于是借這個機會又復(fù)習(xí)了一下接口的概念.
其實我本來以為實現(xiàn)了IComparable<T>接口就可以直接用大于號小于號比較大小了(運算符重載).
然而實際上并不是,還是得調(diào)用.CompareTo方法才能比較大小.
泛型的類型約束用where子句表示, 代碼如下:
將比較邏輯提出到泛型方法中以后,原來的代碼如下:
雖然用了泛型,但還是要先判斷變量的類型,再分別調(diào)用兩次.
因為泛型方法只是聲明,在實際調(diào)用的時候,編譯器實際上還是要根據(jù)傳入的實際類型分別構(gòu)造出兩個不同參數(shù)類型的方法.
Python應(yīng)該不會遇到這種問題吧?應(yīng)該直接寫一次相關(guān)的邏輯處理代碼就可以了.
但是我還沒實際動手試一下,回去有時間試一下.如果不出所料果真如此的話.
那Python一直以來宣傳的簡潔優(yōu)雅的優(yōu)點,我之前卻一直都沒怎么看出來(相較于C#),現(xiàn)在看至少在這個問題上,確實也還是有一定道理的.