gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:13:32 27 4
gpt4 key购买 nike

我自己的通用链表实现有问题。我正在处理的作业说两个子类 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 方法。我看不到的错误是什么?

谢谢你们的帮助,伙计们!

干杯!

最佳答案

您正试图混合两种不同的多态性,但由于它们具有相反的目标,所以不能很好地混合。

“子类化”又名“临时多态性”的要点是使类方法的调用者能够在相似的对象上调用相同的方法并拥有发生不同的事情是因为一些类以临时方式改变了方法行为

泛型(又名“参数多态性”)的要点是能够构造无论数据类型如何都做完全相同的事情。也就是说,您想要创建一个 AVL 树,并且该 AVL 树的工作方式完全相同,无论它是填充了整型还是字符串。

您正试图将这两种多态性强加到一起,但没有成功。如果你想专门化行为,请使用 ad-hoc 多态性。不要使用参数多态性并期望能够以特殊方式专门化方法行为——参数多态性的全部意义在于不会发生。 动物的 AVL 树长颈鹿的 AVL 树 没有不同的行为,尽管 长颈鹿 的行为可能与一只动物

关于c# - 在 C# 中调用泛型子类中的重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7840053/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com