【问题标题】:Virtual function for printing generic linear linked list打印通用线性链表的虚函数
【发布时间】:2014-02-01 01:21:08
【问题描述】:

我有一个任务是在 C# 控制台应用程序中使用泛型实现一个线性链表。

该类还应该包含一个print() 方法来打印列表的元素。 线性列表的条件是 long 类型 (CNodeLong) 或 String 类型 (CNodeString),两者都继承自 CNode 并带有虚函数 Print()。

我在执行打印方法时遇到问题。我不知道它应该放在哪里,以及如何覆盖它。

这是我的 CNode 类和 CList 类:

public class CNode<T>
{
    private CNode<T> next;
    private T item;

    public CNode<T> Next
    {
        get { return next; }
        set { next = value; }
    }

    public T Item
    {
        get { return item; }
        set { item = value; }
    }

     public CNode(T item)
        : this(item,null)
    {
    }

    public CNode(T item, CNode<T> next)
    {
        this.item = item;
        this.next = next;
    }
}

class CList<T>
{
    private CNode<T> first;
    private CNode<T> last;
    private int count;

    public CNode<T> First
    {
        get { return first; }
    }

    public CNode<T> Last
    {
        get { return last; }
    }

    public int Count
    {
        get { return count; }
    }

     public CList(string strListName)
    {
        count = 0;
        first = last = null;
    }
}

【问题讨论】:

  • "ASP.NET 控制台应用程序" - 非常棒...我需要弄清楚您是否需要控制台应用程序(这样您就可以使用Console.Write 等)或 ASP.Net 站点(比需要整理一下你用什么来渲染 WebForms,MVC,...)
  • :) 这是一个控制台应用程序,我可以使用 Console.Write。但是让我困惑的是虚方法,规定必须是虚方法
  • 旁注:C# 代码通常不使用Hungarian notation - 因此对于公共示例,您应该考虑不要在CNode 中使用C 之类的前缀(事实上,如果它需要分配它是微不足道的用VS中的“重命名”重构重命名它)。

标签: c# generics singly-linked-list


【解决方案1】:

您可能应该重写 ToString 方法并将虚拟 Print 方法添加到 CNode。 (我还在 CList 中添加了 PrintList 方法):

public class CNode<T>
{
    ...

    public override string ToString()
    {
        return item.ToString();
    }
    virtual public void Print()
    {
        Console.WriteLine(item);
    }   
}

class CList<T>
{
    ...

    public void PrintList()
    {
        CNode<T> current = first;
        while (current != null)
        {
            Console.WriteLine(current.ToString());
            current = current.Next;
        }
    }
}

然后你可以覆盖子类中的虚方法:

public class CNodeString : CNode<string>
{
    public CNodeString(string item) : base(item) { }

    override public void Print()
    {
        Console.WriteLine("Printing from CNodeString");
        base.Print();
    }
}

public class CNodeLong : CNode<long>
{
    public CNodeLong(long item) : base(item) { }

    override public void Print()
    {
        Console.WriteLine("Printing from CNodeLong");
        base.Print();
    }
}

【讨论】:

  • 感谢您提供此解决方案,但作业指定使用虚函数。帽子可行吗?
  • 当然,你可以在Print方法中添加virtual关键字:public virtual void Print()。但是我在您的代码中看不到继承。你打算在哪里覆盖 Print 方法?
  • 这就是作业中指定的内容。线性列表的条件是长类型(CNodeLong)或字符串类型(CNodeString),两者都继承自具有虚函数Print()的CNode。如果我必须创建另外两个继承自 CNode 的类,我该如何从泛型类型中创建呢?
  • @user3259357 - 看起来你的任务的确切目标是“弄清楚如何使用泛型创建两个从 Node 继承的其他类”......所以你应该先尝试一下。提示:您是否已经在没有“泛型”要求的情况下解决了同样的问题?盯着那个解决方案一段时间......
猜你喜欢
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多