C 中的泛型程式設計總結

2022-09-24 01:48:07 字數 2209 閱讀 6901

今天總結了一下的c#泛型程式設計,就覺得其實c#中的所謂的泛型程式設計和c++中相對應的模版、

泛型設計的功能和機制是很相似的,在c++中有「函式模版 」和「類模版 」,而在c#中則有相應的「泛型方法」和「泛

型類」。

a:先說說「泛型方法」吧,c#中的泛型方法是指使用了型別引數的方法成員,

for example:

public static void swap(ref t x,ref t y)

int a = 1;

int b = 2;

swap(ref a,ref b);//呼叫泛型方法 顯示為引數型別指定具體型別

swap( ref a,ref b);//呼叫泛型方法 由c#編譯器根據傳遞給方法的引數來自動判斷引數型別的具體型別。

同時在使用「泛型方法」時需要說明的幾點是:

一、泛型方法也可以對其引數型別進行型別限制其中包括:主要限制、次要限制、函式限制;(關於型別限制在後面的泛型類中詳解)

二、c#中是不允許對類的建構函式、屬性、事件、索引函式和操作符等特殊函式定義為泛型方法的。

三、泛型方法也可以被定義為虛擬方法、過載方法、抽象方法或密封方法等,泛型方法也可以實現override過載的,當然也能利用其

實現多型,還有一點就是在派生類中過載基類中的泛型方法時,會自動繼承基類中泛型方法的所有型別限制,沒有必要再去重新宣告一遍

四、泛型方法也是可以通過委託機制來呼叫的,其實現機制有兩種,分別是:「普通委託」和「泛型委託」,

for example:

public static void swap(ref t x,ref t y)

public static void clear(ref t x, ref t y)

普通委託:

public delegate void fun(ref int x, ref int y);

int a = 1;

int b = 2;

fun fun1 ;

fun1 = swap;

fun1(ref a,ref b);

泛型委託:

public delegate void fun(ref t x,ref t y);

fun fun2;

fun2 = swap;

fun2(ref a,ref b);

b:泛型類和泛型介面

for example:

class linknode

set

}public linknode next

set

}public linknode()//無參建構函式

public linknode(t t)//帶參建構函式

//向後移動n個節點

public static linknode operator>>(linknode node ,int n)

return node1;

}public static bool operator==(linknode t1,linknode t2)

有上面的這個例子可以看出在寫泛型類或泛型介面有幾點要注意的就是:

一、泛型類的建構函式名稱是與類名同名的,並不包括型別引數。

二、不能隨意的在泛型類中將比較符等運算子運用於型別引數的物件中,這樣是一定會報錯的,但是如果是運用object類中的相關方法則是行的。

三、在乙個泛型類中是可以使用多個泛型引數的。

四、泛型類本身是不能擁有任何東西的,而只有泛型類的構造型別和其具體例項才能擁有成員方法或資料成員的。而在c#中泛型類中的靜態成

員則是屬於該泛型類的構造型別。

五、無論是在寫泛型類、泛型介面或泛型方法時都可以加上型別限制,即c#支援在泛型定義過程中通過where關鍵字來對型別引數進行限制,限制

方式主要包括:主要限制(可以限制為struct值型別或class引用型別)、次要限制(限制該型別引數必須從指定的基類或幾口繼承而來)、建構函式限制

(要求型別引數的目標型別必須提供乙個無參的建構函式),我個人覺得這兒的型別限制其實在c#的程式設計中提供了極大的方便,這個是c++中的模版

所不能及的,但這也同時犧牲了一定的靈活性。

六、由泛型類所 引發的泛型類的繼承問題,在泛型類之間的繼承中有一條最基本的原則就是:「開放型別不能做為封閉型別的基類」,說白了也就是說

在普通類繼承泛型類時,非泛型的普通類是不能直接繼承自泛型類的,但能繼承自泛型類的封閉建構函式。我個人總結就是在繼承的過程中類的「開放性」

不能變小,但能不變或變大。

C 中的泛型總結

net中的泛型功能相當強大,它對實現型別安全和 重用都有很大的作用。現在將泛型的知識整理如下 1 概念 泛型是將型別作為引數傳遞給類 方法 委託 2 泛型的型別約束 是對引數型別進行約束限制,在需要使用引數型別的特定功能時,約束是必須的。如在泛型類中,需要使用引數類的乙個方法時,則必須指定這個引數類...

C 泛型程式設計總結(二)

目錄 7.插入insert 的變形 8.function object 9.設計泛型演算法function object adapter與insertion adapter 10.關聯容器map和set 11.iostream iterator 7.插入insert 的變形 8.function o...

c 泛型程式設計

對於兩個不同的概念a和b,如果概念a所需求的所有功能也是概念b所需求的功能,那麼就說概念b是概念a的子概念。例如 標準模板庫 standard template library,簡稱stl 提供了一些非常常用的資料結構和演算法 將函式物件作為演算法的引數而不是將函式所執行的運算作為演算法的一部分。使...