通用接口/类和继承

时间:2013-08-06 15:55:13

标签: c#-4.0 generics

我想我可能会不恰当地使用通用接口(但不确定所以请告诉我)。我有一个小型的赛马继承等级。有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>();
    }
}

0 个答案:

没有答案