1

我想我可能不恰当地使用了通用接口(但不确定,请告诉我)。我有一个小的赛马继承层次结构。有 3 个主要接口:IMeeting + IRace + IRunner,我为示例减少了这些接口。会议包含包含跑步者的比赛。我已经使用泛型对具体类型做出运行时决策,但它看起来很难看,WriteData 方法参数必须声明 IMeeting 的类型,而 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>();
    }
}
4

0 回答 0