在C#中调用泛型子类中的重写方法

Exp*_*ess 3 c# generics overriding

我在自己的通用链表实现方面遇到了问题.我正在研究的分配说两个子类NodeElementLong和NodeElementString必须从基类NodeElement下降.在NodeElement中应该有一个虚拟方法Print,后代类以自己的方式覆盖和实现.例如,当我在long类型的元素上调用Print方法时,必须调用NodeElementLong子类中的Print方法.

这是代码:

class LinearCollection<T>
{
    NodeElement<T> head = null;

    public bool Add(T element)
    {
        if (head == null)
        {
            head = new NodeElement<T>(element);
        }
        else
        {
            NodeElement<T> current = head;
            while (current.nextNode != null)
            {
                current = current.nextNode;
            }
            current.nextNode = new NodeElement<T>(element);
        }
        return true;
    }

    public NodeElement<T> Get() 
    {
        NodeElement<T> head1 = head;
        head = head.nextNode;
        return head1;
    }

    public void Print()
    {
        for (NodeElement<T> element = head; element != null; element = element.nextNode)
        {
            element.Print();
        }
    }
}

class NodeElement<T>
{
    public T element;
    public NodeElement<T> nextNode = null;

    public NodeElement() { }

    public NodeElement(T element)
    {
        this.element = element;
    }

    public virtual void Print()
    {
        Console.WriteLine(element);
    }
}

class NodeElementLong : NodeElement<long>
{
    public override void Print()
    {
        Console.WriteLine("This is print long: " + element);
    }
}

class NodeElementString : NodeElement<string>
{
    public override void Print()
    {
        Console.WriteLine("This is print string: " + element);
    }
}
Run Code Online (Sandbox Code Playgroud)

我刚刚开始使用C#编程,我对泛型并不熟悉,但我的任务仍坚持使用它们.当我调用Print方法时,会调用虚方法,但我希望调用子类中适当的重写Print方法.哪些是我看不到的错?

谢谢你的帮助,伙计们!

干杯!

Eri*_*ert 13

你试图混合两种不同的多态性,因为它们有相反的目标.

"子类化"又称"ad-hoc多态"的观点是使类方法的调用者能够在类似对象上调用相同的方法,并且会发生不同的事情,因为某些类以临时方式改变了方法行为.

泛型的地步,即"参数多态",无论数据的类型如何,能够构建完全相同的类.也就是说,你想要制作一个AVL树,并且AVL树的工作方式完全相同,无论它是否充满了整数或字符串.

你试图将这两种多态性相互冲突,但它不起作用.如果要专门化行为,请使用ad-hoc多态.不要使用参数多态并期望能够以临时方式专门化方法行为 - 参数多态的整个点是不会发生的.一个动物的AVL树不具有不同的行为比长颈鹿的AVL树,不管事实长颈鹿可能比一个不同的行为的动物.