GenericClass<T>類是一個泛型類型,同樣有靜態成員變量_count,實例構造器中對實例數目進行計算,重載的ToString()方法告訴您有多少GenericClass<T>類的實例存在。GenericClass<T>也有一個_itmes數組和StandardClass類中的相應方法,請參考例4-2。
Example4-2 GenericClass<T>:泛型類
public class GenericClass<T>
{
static int _count = 0;
int _maxItemCount;
T[] _items;
int _currentItem = 0;
public GenericClass(int items)
{
_count++;
_ _maxItemCount = items;
_items = new T[_maxItemCount];
}
public int AddItem(T item)
{
if (_currentItem < _maxItemCount)
{
_items[_currentItem] = item;
return _currentItem++;
}
else
throw new Exception("Item queue is full ");
}
public T GetItem(int index)
{
Debug.Assert(index < _maxItemCount);
if (index >= _maxItemCount)
throw new ArgumentOutOfRangeException("index");
return _items[index];
}
public int ItemCount
{
get { return _currentItem; }
}
public override string ToString()
{
return "There are " + _count.ToString() +
" instances of " + this.GetType().ToString() +
" which contains " + _currentItem + " items of type " +
_items.GetType().ToString() + "";
}
}
從GenericClass<T>中的少許不同點開始,看看_items數組的聲明。它聲明為:
T[] _items;
而不是
object[] _items;
_items數組使用泛型類(<T>)做為類型參數以決定在_itmes數組中接收哪種類型的項。StandarClass在_itmes數組中使用Objcec以使得所有類型都可以做為項存儲在數組中(因為所有類型都繼承自object)。而GenericClass<T>通過使用類型參數指示允許使用的對象類型來提供類型安全。
下一個不同在於AddItem和GetItem方法的聲明。AddItem現在使用一個類型T做為參數,而在StandardClass中使用object類型做為參數。GetItem現在的返回值類型T,StandardClass返回值為object類型。這個改變允許GenericClass<T>中的方法在數組中存儲和獲得具體的類型而非StandardClass中的允許存儲所有的object類型。
public int AddItem(T item)
{
if (_currentItem < _maxItemCount)
{
_items[_currentItem] = item;
return _currentItem++;
}
else
throw new Exception("Item queue is full ");
}
public T GetItem(int index)
{
Debug.Assert(index < _maxItemCount);
if (index >= _maxItemCount)
throw new ArgumentOutOfRangeException("index");
return _items[index];
}