关于C#泛型类的使用

2024-12-31 13:48:52
推荐回答(3个)
回答1:

泛型类封装不是特定于具体数据类型的操作。 泛型类最常用于集合,如链接列表、哈希表、堆栈、队列、树等。 像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关。对大多集合类的操作,推荐使用 .NET Framework 类库中所提供的类。
(1)泛型类可以继承具体类、封闭式构造、开放式构造基类。
代码如下:
class BaseNode { }
class BaseNodeGeneric { }
// 继承具体类
class NodeConcrete : BaseNode { }
//继承封闭式构造基类
//封闭式构造基类指基类类型参数指定具体类型
class NodeClosed : BaseNodeGeneric { }
//继承开放式构造基类
//开放式构造基类指基类类型参数未指定
class NodeOpen : BaseNodeGeneric { }
(2)基类类型参数必须在子类中指定实现。
代码如下:
//正确
class Node1 : BaseNodeGeneric { }
//错误
//在子类中未指定父类类型参数实现
class Node2 : BaseNodeGeneric {}
//错误
//在子类中未指定父类类型参数实现
class Node3 : T {}
class BaseNodeMultiple { }
//正确
class Node4 : BaseNodeMultiple { }
//正确
class Node5 : BaseNodeMultiple { }
//错误
//在子类中未指定父类类型参数实现
class Node6 : BaseNodeMultiple {}
(3)从开放式构造类型继承的泛型类必须指定约束,这些约束是基类型约束的超集或暗示基类型约束。
代码如下:
class NodeItem where T : System.IComparable, new() { }
class SpecialNodeItem : NodeItem where T : System.IComparable, new() { }
(4)泛型类型可以使用多个类型参数和约束。
代码如下:
class SuperKeyType
where U : System.IComparable
where V : new()
{ }
(5)开放式构造类型和封闭式构造类型可以用作方法参数。
代码如下:
void Swap(List list1, List list2)
{ }
void Swap(List list1, List list2)
{ }

回答2:

    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);
        }
    }

回答3:

写成这样就行了
(object)content[p] == (object)elem