1.泛型概念:
本質上,
術語」泛型」指的是」引數化型別(parameterized types)」.引數化型別非常重要
,因為它們可以在建立類.結構
.方法和委託的時候將要操作的資料型別作為參
數進行指定
.使用引數化型別的類.結構
.方法和委託都可以稱為泛型
,如」泛型類」或者」泛型方法」.
在具體宣告乙個變數或者例項化之前,型別引數t
只是乙個佔位符。等到具體宣告和例項化的時候,編譯器要求**指定型別引數。泛型型別宣告了泛型
參
數佔位符型別
,由泛型型別的使用者填寫這些佔位符
,並作為泛型的引數提供給泛型型別
.
2.泛型約束:約束宣告了泛型要求的型別引數的特徵。
為了宣告乙個約束,
需要使用where
關鍵字,
後跟一對」引數:
要求」.其中,」引數」必須是泛型型別中定義的乙個引數,
而」要求」用於限制型別從
中」派生」的類或接
口,或者限制必須存在乙個預設構造器
,或者限制使用乙個引用
/值型別約束
.2.1
基類約束(where t:base-class-name
)
有的時候,你可能需要限制型別從乙個特定的類派生.這是用基類約束(base class constraint)做到的.使用基類約束,可以指定某個型別實參
必須繼承的基類.基類約束有兩個重要功能.
首先,他允許在泛型類中使用由約束指定的基類所定義的成員.例如,可以呼叫基類的方法或者使用基類的屬性.如果沒有基類約束,編譯器就無法知道某
個型別實參擁有哪些成員.通過提供基類約束,編譯器將知道所有的型別實參都擁有由指定的基類所定義的成員.
基類約束的第二個功能是,確保只適用支援指定基類的型別實參.這意味著對於任意給定的基類約束,型別實參要麼是基類本身,要麼是派生於該基
類.如果
試圖使用沒有匹配或者繼承指定的型別實參,就會導致編譯錯誤 例:
using system;
using system.collections.generic;
using system.linq;
using system.text;
//泛型:基類約束
//基類約束兩個作用:1.基類約束允許泛型類訪問基類的成員
// 2.確保只能使用滿足該約束的型別引數,從而實現型別安全
namespace generic
public string name
public phonenumber(string n, string num)
}///
/// 朋友**
///
class friend : phonenumber
public friend(string n, string num, bool wk)
: base(n, num)
}///
/// **商**
///
class supplier : phonenumber
}/*為了管理**列表,下面建立乙個名為phonelist的類.由於希望該類能夠
* 管理任意型別的**列表,因此將其實現為泛型.另外,由於列表管理的一部分內容是
* 根據姓名查詢號碼,或者根據號碼查詢姓名,因此要給它新增約束,從而
* 確保儲存在列表中的物件的型別必須是phonenumber派生類的例項
*////
/// 管理任意型別的**列表
///
///
class phonelistwhere t:phonenumber
public bool add(t newentry)
public t findbyname(string name)
throw new notfoundexception();
}public t findbynumber(string number)
throw new notfoundexception();}}
///
/// 此類沒有繼承phonenumber,因此不能用於建立phonelist
///
class emailfriend
/** 這是乙個定製異常,雖然該示例只使用預設建構函式,但是出於說明的
* 目的,notfoundexception實現了exception定義的所有建構函式
* 注意:這些建構函式只呼叫了exception定義的相等基類建構函式.
* notfoundexception沒有向exception新增任何內容,因此不需要
* 執行任何進一步的操作
*/ class notfoundexception : exception
public notfoundexception(string str):base( str){}
public notfoundexception(string str, exception inner) :
base(str, inner)
protected notfoundexception(
system.runtime.serialization.serializationinfo si,
system.runtime.serialization.streamingcontext se) :
base(si, se) }}
怎樣呼叫:
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.collections;
namespace
generic
//基類約束
public
static
void
baseclassconstraint()
);//正確新增
plist.add(new friend("
tom", "
5555-333
", true
)); plist.add(
new friend("
gary
", "
5555-332
", true
)); plist.add(
new friend("
wangc
", "
5555-331
", false
));
try
catch
(notfoundexception)
//**商
phonelistplist2 = new phonelist();
plist2.add(
new supplier("
global hardware
", "
400-123
"));
plist2.add(
new supplier("
computer
", "
400-124
"));
plist2.add(
new supplier("
networkcity
", "
400-125
"));
try
catch
(notfoundexception)
//沒有繼承的
//phonelistplist3 = new phonelist();
} }
}
未完待續……
看到他我一下子就悟了 委託
不用先看例子什麼的,你就多品味品味這句話,然後你看下使用委託的步驟,1.定義乙個委託 2.註冊該委託 3.使用委託 它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡憋得慌,渾身不自在 其實不用怕,你就按著這三步來標準沒錯,下面來個小例子 第一步 定義委...
看到他我一下子就悟了 委託
不用先看例子什麼的,你就多品味品味這句話,然後你看下使用委託的步驟,1.定義乙個委託 2.註冊該委託 3.使用委託 它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡憋得慌,渾身不自在 其實不用怕,你就按著這三步來標準沒錯,下面來個小例子 第一步 定義委...
Python機器學習為啥就一下子紅遍全球了呢???
在這篇文章中我們會講python的重要特徵和它適用於機器學習的原因,介紹一些重要的機器學習包,以及其他你可以獲取更詳細資源的地方。為什麼用python做機器學習 python很適合用於機器學習。首先,它很簡單。如果你完全不熟悉python但是有一些其他的程式設計經驗 c或者其他程式語言 要上手是很快...