泛型类封装不是特定于具体数据类型的操作。 泛型类最常用于集合,如链接列表、哈希表、堆栈、队列、树等。 像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关。对大多集合类的操作,推荐使用 .NET Framework 类库中所提供的类。
(1)泛型类可以继承具体类、封闭式构造、开放式构造基类。
代码如下:
class BaseNode { }
class BaseNodeGeneric
// 继承具体类
class NodeConcrete
//继承封闭式构造基类
//封闭式构造基类指基类类型参数指定具体类型
class NodeClosed
//继承开放式构造基类
//开放式构造基类指基类类型参数未指定
class NodeOpen
(2)基类类型参数必须在子类中指定实现。
代码如下:
//正确
class Node1 : BaseNodeGeneric
//错误
//在子类中未指定父类类型参数实现
class Node2 : BaseNodeGeneric
//错误
//在子类中未指定父类类型参数实现
class Node3 : T {}
class BaseNodeMultiple
//正确
class Node4
//正确
class Node5
//错误
//在子类中未指定父类类型参数实现
class Node6
(3)从开放式构造类型继承的泛型类必须指定约束,这些约束是基类型约束的超集或暗示基类型约束。
代码如下:
class NodeItem
class SpecialNodeItem
(4)泛型类型可以使用多个类型参数和约束。
代码如下:
class SuperKeyType
where U : System.IComparable
where V : new()
{ }
(5)开放式构造类型和封闭式构造类型可以用作方法参数。
代码如下:
void Swap
{ }
void Swap(List
{ }
class SequentialQueue
{
//......
/* 对象成员 */
//队列内容
T[] content;
//队列“指针”
Int32 front; //头“指针”
Int32 rear; //尾“指针”
Int32 sizeUsed, sizeAll;
//......
//查找elem元素,返回元素位置到location
public void searchElem(ref Int32 location, T elem)
{
Int32 p;
location = 0;
int counter;
for (p = front, counter = 1; counter <= sizeUsed; counter++)
{
if (AreEqual(elem, content[p]))
{
location = counter;
break;
}
p = (p + 1) % sizeAll;
}
}
public bool AreEqual(T p1, T p2)
{
return EqualityComparer.Default.Equals(p1, p2);
}
}
写成这样就行了
(object)content[p] == (object)elem