最顯著的一點就是它引數化了型別,把型別作為引數抽象出來,從而使我們在實際的運用當中能夠更好的實現**的重複利用,同時它提供了更強的型別安全,更高的效率,不過在約束方面,它只支援顯示的約束,這樣在靈活性方面就顯得不是那麼好了。我覺得它之所以能夠提供更高的效率是因為泛型在例項化的時候採用了"on-demand"的模式,即按需例項化,發生在jit(just in time)編譯時。
下面來看如何定義乙個泛型類,很簡單,你只需要意識到一點,在這裡,型別已經被引數化了:
using system;
using system.collections.generic;
using system.text;
namespace generictest
}/**
/// 定義乙個泛型類,該類有兩個型別引數,分別是t,s
/// 型別引數
/// 型別引數
public class test
public void setvalue()}}
上面的例子不是很恰當,目的是讓初學泛型的你了解一下泛型的定義及例項化方法,如上,我們定義了乙個泛型類,那麼如何實現泛型類的繼承呢?這裡需要滿足下面兩點中的任何一點即可:
1、泛型類繼承中,父類的型別引數已被例項化,這種情況下子類不一定必須是泛型類;
2、父類的型別引數沒有被例項化,但**於子類,也就是說父類和子類都是泛型類,並且二者有相同的型別引數;
//如果這樣寫的話,顯然會報找不到型別t,s的錯誤
public class testchild : test
//正確的寫法應該是
public class testchild : test
public class testchild: test
public class testchild: test
接著我們來看看泛型介面,其建立以及繼承規則和上面說的泛型類是一樣的,看下面的**:
public inte***ce ilist
public inte***ce idictionary
// 泛型介面的型別引數要麼已例項化
// 要麼**於實現類宣告的型別引數
class list: ilist, idictionary
public void add(int index, t value) {}}
在來看一下泛型委託,首先我們定義乙個型別引數為t的委託,然後在類中利用委託呼叫方法:
using system;
using system.collections.generic;
using system.text;
namespace generictest
static string g(string s)
static void main(string args)} }
我們再來看泛型方法,c#的泛型機制只支援在方法申明上包含型別引數,也即是泛型方法。特別注意的是,泛型不支援在除了方法以外的其他類/介面成員上使用型別引數,但這些成員可以被包含在泛型型別中,並且可以使用泛型型別的型別引數。還有一點需要說的就是,泛型方法可以在泛型型別中,也可以存在於非泛型型別中。下面我們分別看一下泛型型別的申明,呼叫,過載和覆蓋。
using system;
using system.collections.generic;
using system.text;
namespace generictest
//呼叫泛型方法
//注意:在呼叫泛型方法時,對泛型方法的型別引數例項化
public int usemethod()
//過載getvalue方法
public int getvalue(int i)
}//下面演示覆蓋
//要注意的是,泛型方法被覆蓋時,約束被預設繼承,不需要重新指定約束關係
abstract class parent
class child : parent}}
最後我們來看一下泛型中的約束:
c#中的泛型只支援顯示的約束,因為這樣才能保證c#所要求的型別安全,但顯示的約束並非時必須的,如果不加約束,泛型型別引數將只能訪問system.object型別中的公有方法。「顯式約束」由where子句表達,可以指定「基類約束」,「介面約束」,「構造器約束」,「值型別/引用型別約束」共四種約束。下面的例子**於李建忠老師的講座ppt。
1、基類約束:
class a }
class b }
class c
where s: a // s繼承自a
where t: b // t繼承自b
2、介面約束
inte***ce iprintable
inte***ce icomparable
inte***ce ikeyprovider
class dictionary
where k: icomparable
where v: iprintable, ikeyprovider
3、構造器約束
class a }
class b }
class c
where t : new()
cc=new c(); //可以,a有無參構造器
cc=new c(); //錯誤,b沒有無參構造器
4、值/引用型別約束
public struct a
public class b
class c
where t : struct
cc=new c(); //可以,a是乙個值型別
cc=new c(); //錯誤,b是乙個引用型別
C 2 0泛型程式設計基礎
最顯著的一點就是它引數化了型別,把型別作為引數抽象出來,從而使我們在實際的運用當中能夠更好的實現 的重複利用,同時它提供了更強的型別安全,更高的效率,不過在約束方面,它只支援顯示的約束,這樣在靈活性方面就顯得不是那麼好了。我覺得它之所以能夠提供更高的效率是因為泛型在例項化的時候採用了 on dema...
C 泛型程式設計基礎
泛型程式設計技術支援程式設計師建立函式和類的藍圖 即模板,template 而不是具體的函式和類。定義模板 template 1.函式模板 template void foo t param t代表一種不確定的資料型別。example template void swap t a,t b 2.類模板...
JAVA基礎之泛型程式設計
一 什麼是泛型?所謂的泛型是指 允許在定義類 介面 方法時使用型別引數,這個型別引數將在 宣告變數 建立物件 呼叫方法時動態地指定。泛型類相當於乙個模板,在編譯期無法確定具體的型別,只有在建立物件時候需要動態指定具體的型別。注意點 1 泛型不能用在靜態屬性上 2 泛型使用時要傳入具體的引用資料型別 ...