繁体   English   中英

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

[英]Calling overridden method in generic subclass in C#

我在自己的通用链表实现方面遇到了问题。 我正在研究的分配说两个子类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);
    }
}

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

谢谢你的帮助,伙计们!

干杯!

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

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

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

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

它没有按照您的期望进行操作的原因是您创建的NodeElement实际上是NodeElement <long>类型(与NodeElementLong不同)。 要使这项工作,您需要将实际的元素类型作为第二个类型参数传递

class LinearCollection<T, NodeType> where NodeType : NodeElement<T>, new()
{
    public bool Add(T element)
    {
        if (head == null)
        {
            head = new NodeType();
            head.Value = element;
        }
        ...
    }
}

关于泛型类型的全部内容是您不需要像这样的特定实现。

在我看来,你还没有掌握仿制药的概念。 寻找对泛型的一个很好的介绍(搜索引擎x会给你很多)并仔细研究它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM