Generic

Generic

泛型(Generics)是VisualBasic2005中的一種新特性,然而很多開發者在第一次看到它的時候可能忽略它,但是他們最終會發現,在了解泛型之後,離開了泛型就幾乎不能工作了。

C++泛型

泛型是程式設計語言的一種特性。允許程式設計師在強類型程式設計語言中編寫代碼時定義一些可變部分,那些部分在使用前必須作出指明。各種程式設計語言和其編譯器、運行環境對泛型的支持均不一樣。

在C++程式語言中,泛型程式設計主要是由函式模板(function template)與類型模板(class template)來支持的,這種觀念是取材自Simula的泛型程式設計。它採用typename和class兩個關鍵字,來標識模板類型的類型參數。C++之父Bjarne Stroustrup認為可以通過C++的重載(overloading)功能來表達泛型。

C++中的STL(Standard Template Library)中的vector,list就屬於泛型類

java泛型

介紹

泛型是Java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。這種參數類型可以用在類、接口和方法的創建中,分別稱為泛型類、泛型接口、泛型方法。

Java語言引入泛型的好處是安全簡單。

在Java SE 1.5之前,沒有泛型的情況的下,通過對類型Object的引用來實現參數的“任意化”,“任意化”帶來的缺點是要做顯式的強制類型轉換,而這種轉換是要求開發者對實際參數類型可以預知的情況下進行的。對於強制類型轉換錯誤的情況,編譯器可能不提示錯誤,在運行的時候才出現異常,這是一個安全隱患。

泛型的好處是在編譯的時候檢查類型安全,並且所有的強制轉換都是自動和隱式的,提高代碼的重用率。

規則和限制

1、泛型的類型參數只能是類類型(包括自定義類),基礎類型會被自動打包為對應的包裝類型。

2、同一種泛型可以對應多個版本(因為參數類型是不確定的),不同版本的泛型類實例是不兼容的。

3、泛型的類型參數可以有多個。

4、泛型的參數類型可以使用extends語句,例如<T extends superclass>。習慣上稱為“有界類型”。

5、泛型的參數類型還可以是通配符類型。例如Class<?> classType = Class.forName(java.lang.String);

泛型還有接口、方法等等,內容很多,需要花費一番功夫才能理解掌握並熟練套用。

類屬編程

(generic programming)

generic是構成庫的另一種方式, 這與傳統的oop是不同的.這類程式庫一般由類屬組件和類屬算法組成,組件和算法通過疊代器組裝起來,組件則對疊代器提供一定的封裝.這種程式庫的優點在於能夠提供比傳統程式庫更靈活的組裝方式,而不損失效率.

STL,boost,ACE,ATL等庫都是建構在generic的概念之上.STL對疊代器進行了分類,分類是從支持的功能上的,不同的類屬算法對疊代器有不同的要求.下面對疊代器的種類做一下歸納。

1. Input Iterator(輸入疊代器) : 單向讀取和遍歷.

2. Output Iterator(輸出疊代器):單向寫入和遍歷.

3. Forward Iterator(前向疊代器):單向,讀,寫,支持多路遍歷

4. Bidirectional Iterator(雙向疊代器): 雙向,讀,寫,支持多路遍歷

5. RandomAccessIterator(隨機訪問疊代器):隨機訪問,讀,寫,支持多路遍歷

強化(Refinement) 五種疊代器有一種歸屬關係.1<-2<-3<-4<-5

list容器提供了BidirectionalIterator,因此可以用於find算法(該算法需要InputIterator)

但sort算法(需要RandomAccessIterator),因此下面的代碼不能通過編譯.

list<int> lst;

//... code insert value in lst

sort (lst.begin(), lst.end() ) ; // error!!!

我們知道deque提供了RandomAccessIterator,因此他卻可以使用sort算法,而且能高效運行.

VB.NET(2005)

泛型這個專業術語並沒有道出這種特性能夠實現的真實功能。假設我們需要編寫一個執行數學計算的類(class)。使用標準的代碼編寫技術,你必須為整型和實數型(對於所有的形式)編寫獨立的方法。通過使用泛型,你可以一次性編寫方法,並讓.NET框架組件為你處理數據類型的問題。泛型可以使你在編程過程中體會到更多的快樂。你不需要額外的工作就能體會到代碼重用(reuse)的優點。

一、泛型的優點

使用泛型可以提高性能,其中顯著的一個改進是.NET框架組件不會在值類型上使用裝箱(boxing);使用泛型類的另一個令人驚訝的特性是IntelliSense居然可以跟蹤強數據類型定義。

二、建立泛型類

使用泛型的時候,你應該選擇建立有廣泛用途的類,這樣的話所建立的泛型類所花費的時間最終會整個開發時間上獲得回報。例如,集合就是一種處理多個數據類型的類,而一般你會在多個應用程式中使用同一個集合的多種不同的形式,如果採用泛型,那么就不需要多次重複的建立不同形式的同一集合。

三、使用泛型類

我們在上面建立的泛型類在使用方法上與其他類沒有什麼不同,仍然需要將其實例化。

四、約束泛型類

也許你對實例中泛型類能夠接受任何數據類型感恐懼,你不得不擔心在使用中出現程式仍然會對錯誤參數產生反映,對,是存在這樣的風險,不過我們可以對泛型類加以約束。

五、為泛型類定義多個類型

你不必僅僅使用一種數據類型定義每個類,泛型類也提供多個數據類型,你所需要做的是用逗號分開每種數據類型。

結束語

儘管泛型類起先看起來僅僅是前進的一步,但是它們實際上是.NET革命中的一個巨大飛躍。使用泛型把你從為每個數據類型建立新類中釋放了出來,提高了性能,並減少了開發和調試的時間。為了體會Visual Studio 2005中最好的部分,你真的應該試著使用這個新特性——你會發現自己將很喜歡它的。

泛型有哪些重要優點?

你可能想知道泛型除了減少輸入之外還提供哪些功能,畢竟你仍然需要建立類來處理信息。它的最好的特性在於正確地構建的泛型類可以真正減少代碼中的安全性問題。由於你使用幾個數據類型定義類,你不必依賴於通用Object類型。泛型類依賴於強數據類型定義,這與其它類在處理特定數據類型的時候是相同的。簡短的說,儘管你獲得了很大的靈活性,但是作為結果的代碼卻更加優良。

使用泛型類還可以提高性能。其中最大的一個改進是.NET框架組件不會在值類型上使用包裝(boxing)。儘管泛型類可以使用多個數據類型工作,但是它在後台單獨地處理每一種數據類型。這種技術確保了在你的工作量最小的情況下,應用程式提供最佳的性能。

使用泛型類的另一個令人驚訝的特性是IntelliSense居然可以為你跟蹤強數據類型定義。與使用對象建立處理多個數據類型的通用方法不同,你的代碼依賴於強數據類型定義,這意味著IntelliSense為你提供了更多的信息。這種特性不但使我們更容易處理代碼,還減少了錯誤和調試時間。

相關詞條

相關搜尋

熱門詞條

聯絡我們