如何只使用一个列表

时间:2012-11-23 21:00:58

标签: c# list polymorphism

嘿所以我需要设计一个程序,可以将公司的皮卡或交货添加到我的课程列表中,我已经制作了一个名为访问的列表,如下所示。

我想知道如何将每个提货或交货添加到列表中,以便能够区分最初的内容,以便我可以显示仅提货或仅提供交货。

class List
{
/*
 * This object represents the List. It has a 1:M relationship with the Visit class
 */

    private List<Visits> visits = new List<Visits>();
    //List object use to implement the relationshio with Visits

    public void addVisits(Visits vis)
    {
        //Add a new Visit to the List
        visits.Add(vis);
    }

    public List<String> listVisits()
    {//Generate a list of String objects, each one of which represents a Visit in List.

        List<String> listVisits = new List<string>();
        //This list object will be populated with Strings representing the Visits in the lists

        foreach (Visits vis in visits)
        {
            String visAsString = vis.ToString();
            //Get a string representing the current visit object

            listVisits.Add(visAsString);
            //Add the visit object to the List
        }

        return listVisits;
        //Return the list of strings
    }

    public Visits getVisits(int index)
    {
        //Return the visit object at the <index> place in the list

        int count = 0;
        foreach (Visits vis in visits)
        {
            //Go through all the visit objects
            if (index == count)
                //If we're at the correct point in the list...
                return vis;
            //exit this method and return the current visit
            count++;
            //Keep counting
        }
        return null;
        //Return null if an index was entered that could not be found
    }

显示代码

       /*
         * Update the list on this form the reflect the visits in the list
         */
        lstVisits.Items.Clear();
        //Clear all the existing visits from the list

        List<String> listOfVis = theList.listVisits();
        //Get a list of strings to display in the list box


        lstVisits.Items.AddRange(listOfVis.ToArray());
        //Add the strings to the listBox. Note to add a list of strings in one go we have to 
        //use AddRange and we have to use the ToArray() method of the list that we are adding

2 个答案:

答案 0 :(得分:1)

看起来你有PickupDelivery继承了一个名为Visits * 的公共类。

更改Visits以提供区分访问类型的方法,例如:

enum VisitKind {
    Pickup,
    Delivery
}

public class Visits {
    public VisitKind KindOfVisit {get;private set;}
    protected Visits(VisitKind kind) {
        KindOfVisit = kind;
    }
}

现在修改PickupDelivery的构造函数,将正确的类型传递给超类的构造函数,如下所示:

public class Pickup : Visits {
    public Pickup() : base(VisitKind.Pickup) {}
}
public class Delivery : Visits {
    public Delivery() : base(VisitKind.Delivery) {}
}

现在,您可以检查KindOfVisitPickup共有的Delivery属性,以便在运行时告知访问类型:

public IList<Delivery> GetDeliveries() {
    var res = new List<Delivery>();
    foreach (var v in visits) {
        if (v.KindOfVisit == VisitKind.Delivery) {
            res.Add((Delivery)v);
        }
    }
    return res;
}

此解决方案并不理想,因为当有人添加新访问时,处理访问的代码将继续照常编译。但是,解决此问题的方法比添加属性要困难得多:一种解决方案是使用Visitor Pattern,这比简单的Kind属性更好,但它有自己的局限性。

<小时/> * 用复数名词命名一个类是非常规的 -​​ Visit可能是一个更好的名字。

答案 1 :(得分:0)

在Visits类中添加一个参数,用于跟踪它是拾取还是传递,并在Visits类中添加getType()/ setType()方法以检索它是哪种类型