2

親クラス Visit と子クラスInpatientVisitClinicVisitなど があります。最終的には、訪問のリストを作成したいと思います。ここで、タイプは親または任意の子になります。これまでのところ、私はこれを行うことができます:

Type visitType = null;
        Visit visit = new Visit();
        switch (typeOfVisit)
        {
            case VisitType.All:
                visit = new Visit();
                break;
            case VisitType.Inpatient:
                visit = new InpatientVisit();
                break;
            case VisitType.Clinic:
                visit = new ClinicVisit();
                break;
            case VisitType.Emergency:
                visit = new EmergencyVisit();
                break;
            case VisitType.DaySurgery:
                visit = new DaySurgeryVisit();
                break;
            default:
                break;
        }

        visitType = visit.GetType();

これは私が立ち往生するところです。最終的に私はこのようなことをしたい:

for (int rowCounter = 0; rowCounter < data.Rows.Count; rowCounter++)
        {
            Visit thisVisit = new Visit(data, rowCounter);
            this.Add(thisVisit);
        }

`Visit thisVisit = new Visit(data, rowCounter); の代わりが必要です。

適切なコンストラクターが現在または存在する予定です。

4

3 に答える 3

2

それらがすべて実装するインターフェースを作成します。

public interface IVisit
{
    // put any common function signatures here 
}

リストは として入力できList<IVisit>、その時点でどの訪問タイプが保存されているかは問題になりません。次に、どのタイプの IVisit を返すかを知ることを担当するファクトリ メソッドを作成できます。

public static IVisit GetVisitInstance(VisitType typeToCreate)
{
     switch(typeToCreate)
     {
        case VisitType.All:
           return new Visit();

        case VisitType.Inpatient:
            return new InpatientVisit();

        case VisitType.Clinic:
            return new ClinicVisit();

        case VisitType.Emergency:
            return new EmergencyVisit();

        case VisitType.DaySurgery:
            return new DaySurgeryVisit();

        default:
            return null;
     }
} 

これは最もスケーラブルなソリューションではありません。検索すると、これを行うはるかに優れた (再: スケーラブルな) ファクトリ実装が見つかります。しかし、すでに持っているものを考えると、これはかなり簡単な方法です。

于 2012-11-29T18:19:24.860 に答える
1

type のクラスを作成しVisit、このクラスにクラスのオブジェクトを挿入する場合: 、指摘されているVisit, InpatientVisit, linicVisit, EmergencyVisitようにインターフェイスを使用するのが最善の方法です。 ただし、親クラスのリストを作成して、派生クラスをリストに追加するだけです。 次の構造があるとします。 @Joel Etherton

 class Visit
    {
        public string VisitName { get; set; }
    }
    class ImpatientVisit : Visit
    {
        public int ImpatientProperty { get; set; }
    }

次に、次のような訪問のリストを作成できます。

            List<Visit> listOfVisits = new List<Visit>();

            var regularVisit = new Visit();
            regularVisit.VisitName = "regular";

            var impatientVisit = new ImpatientVisit();
            impatientVisit.VisitName = "impatient";
            impatientVisit.ImpatientProperty = 3;

            listOfVisits.Add(regularVisit);
            listOfVisits.Add(impatientVisit);

次に、次のようにリストを反復処理できます。

            foreach (var visit in listOfVisits)
            {
                Console.WriteLine(visit.VisitName);
            }

これは印刷されます

regular
patient

ImpatientVisitただし、キャストしないとプロパティにアクセスできません。
したがって、次のようなことができます。

            foreach (var visit in listOfVisits)
            {
                var impVisit = visit as ImpatientVisit;
                if (impVisit != null)
                {
                    Console.WriteLine(impVisit.ImpatientProperty + " "+ impVisit.VisitName);
                }
                else
                {
                    Console.WriteLine(visit.VisitName);
                }
            }  

これは印刷されます

regular
3 impatient
于 2012-11-29T18:26:03.170 に答える
0

Activatorクラスを使用して、これを行うためのファクトリメソッドを作成できます。

public static T CreateVisit<T>(DataSet ds, int row) where T : IVisit, new()
{
    return (T)Activator.CreateInstance(typeof(T), new object[] { ds, row });
}

注:すべてのクラスは、インターフェースIVisitを実装する必要があります

これは、次のようにコードから呼び出されます。

InpatientVisit inpatientVisit = CreateVisit<Inpatient>(data, row);
于 2012-11-29T18:57:29.450 に答える