我有一个父类访问子类InpatientVisit
,ClinicVisit
等等。最终我想创建一个访问列表,其中类型可以是父类或任何子类< / strong>即可。到目前为止,我可以这样做:
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);
}
我需要替换`访问thisVisit =新访问(data,rowCounter);
当前或将存在适当的构造函数。
答案 0 :(得分: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;
}
}
这不是最具扩展性的解决方案,如果您搜索一下,您会发现更好的(re:Scalable)工厂实现。但鉴于你已经拥有的东西,这应该是一个相当简单的方法。
答案 1 :(得分:1)
如果要创建类型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
答案 2 :(得分: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);