我想我可能会不恰当地使用通用接口(但不确定所以请告诉我)。我有一个小型的赛马继承等级。有3个主要接口:IMeeting + IRace + IRunner,我已经减少了这个例子。会议包含包含跑步者的比赛。我已经使用泛型来对具体类型做出运行时决定,但它看起来很难看,WriteData方法param必须声明IMeeting的类型,它必须为IRace声明类型等,例如。
static void WriteData(IMeeting<IRace<IRunner, string>> meeting)
这是一个小例子:
class Program
{
static void Main(string[] args)
{
IMeeting<IRace<IRunner, string>> meeting = new Meeting<IRace<IRunner, string>>();
IRace<IRunner, string> slrace = new SL_Race<IRunner, string>();
IRunner slrunner = new SL_Runner();
slrace.Runners.Add(slrunner);
meeting.Races.Add(slrace);
WriteData(meeting);
}
static void WriteData(IMeeting<IRace<IRunner, string>> meeting)
{
// Write to db or whatever
}
}
public interface IMeeting<T_Race>
{
string Course { get; set; }
string CourseId { get; set; }
List<T_Race> Races { get; set; }
}
public class Meeting<T_Race> : IMeeting<T_Race>
{
public string Course { get; set; }
public string CourseId { get; set; }
public List<T_Race> Races { get; set; }
public Meeting()
{
Races = new List<T_Race>();
}
}
public interface IRace<T_Runner, T_Going>
{
T_Going Going { get; set; }
List<T_Runner> Runners { get; set; }
}
public interface ISL_Race<T_Runner, T_Going> : IRace<T_Runner, T_Going>
{
// Extended behaviour
string Time { get; set; }
string RaceId { get; set; }
string Info { get; set; }
uint MaxOR { get; set; }
}
public class SL_Race<T_Runner, T_Going> : ISL_Race<T_Runner, T_Going>
{
// IRace
public T_Going Going { get; set; }
public List<T_Runner> Runners { get; set; }
// ISL_RACE
public string Time { get; set; }
public string RaceId { get; set; }
public string Info { get; set; }
public uint MaxOR { get; set; }
public SL_Race()
{
Runners = new List<T_Runner>();
}
}
public interface IRunner
{
string Name { get; set; }
}
public class SL_Runner : IRunner
{
public string Name { get; set; }
}
在我的真实应用程序中,有几种不同类型的混凝土跑步者和比赛。我正在尝试在运行时创建相关会议。在我看来,IMeeting必须有一个IRaces的声明,但具体的种族类型在运行时才能知道,对于跑步者来说也是如此。我的真实世界的应用程序也有更多的通用参数,我最终看到丑陋的方法签名,必须知道层次结构的类型,例如。
public List<IMeeting<IRP_Race<IRP_Runner, Going>>> ExtractMeetingList(String dayResultPage)
所以我不恰当地使用泛型?我可以通过将泛型属性向下移动到具体类来删除所有泛型,并将它们指定为非泛型,例如我可以将IRace.Runners移动到SL_Race类,但在我看来它应该在IRace中,因为竞赛界面应该有跑步者。
感谢您的任何意见。
**编辑 - 考虑过它我应该删除泛型,只需创建一个具有所需类型的子类,这些子类将在编译时知道,例如。
public interface IMeeting
{
string Course { get; set; }
string CourseId { get; set; }
}
// This is the new subclass with the list of concrete races "ISL_RACE"
public class ISL_Meeting : IMeeting
{
List<ISL_Race> Races { get; set; }
}
public class SL_Meeting : ISL_Meeting
{
public string Course { get; set; }
public string CourseId { get; set; }
List<ISL_Race> Races {get; set;}
public SL_Meeting()
{
Races = new List<ISL_Race>();
}
}