0

ねえ、会社のピックアップまたはデリバリーをコースワークのリストに追加できるプログラムを設計する必要があります。以下に示すように、訪問と呼ばれるリストを作成しました。

集荷のみまたは配送のみを表示できるように、元のものと区別できるように各集荷または配送をリストに追加する方法を知りたいです。

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
4

2 に答える 2

1

*という共通クラスPickupを継承しているようです。DeliveryVisits

Visitsたとえば、次のように、訪問の種類を区別する方法を提供するように変更します。

enum VisitKind {
    Pickup,
    Delivery
}

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

Pickup次のように、とのコンストラクターを変更してDelivery、スーパークラスのコンストラクターに正しい種類を渡します。

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

これで、実行時に訪問の種類を伝えるために共通KindOfVisitのプロパティを調べることができます。PickupDelivery

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;
}

誰かが新しい種類の訪問を追加すると、訪問を処理するコードが通常どおりコンパイルを続行するため、このソリューションは理想的ではありません。ただし、この問題の解決策は、プロパティを追加するよりもはるかに困難です。1 つの解決策は、単純な属性よりも優れたビジター パターンKindを使用することですが、独自の制限があります。


*名詞の複数形でクラスに名前を付けるのは型破りです -Visitおそらくもっと良い名前でしょう。

于 2012-11-23T21:16:06.250 に答える
0

集荷か配達かを追跡するパラメータを Visits クラスに追加し、Visits クラスに getType() /setType() メソッドを追加して、どちらのタイプであったかを取得します

于 2012-11-23T21:11:46.590 に答える