我需要在C#中为与跆拳道比赛相关的上下文建模,其中有更多比赛组成的锦标赛。具体来说,相对于最初的运动员数量,一场比赛最多可以进行3场比赛:淘汰赛,半决赛和决赛。在每场比赛中,我想跟踪运动员所做的Poomsaes(一种运动员展示)。在淘汰赛或半决赛中,有一种特定的Poomsae具有预期的结果,其类型与最终情况下(不同参数等)不同。
因此,我有一个代表通用匹配项的接口(其中包含能够处理特定类型的PoomsaeResult的Poomsaes)。由于拥有具有泛型类型的属性的困难,我将该概念分为两种方法。
public interface IMatch<R, P> where R : IPoomsaeResult where P : IPoomsae<R>
{
void AddScheduledPoomsae(P poomsae);
ISet<P> GetScheduledPoomsaes();
}
还有两个实现,它们的接口只是:
public interface IStandardMatch : IMatch<IStandardPoomsaeResult, IStandardPoomsae>
{
}
public interface IFinalMatch : IMatch<IFinalPoomsaeResult, IFinalPoomsae>
{
}
在锦标赛课程中,我想拥有一个字典,将锦标赛的各个阶段(淘汰赛,半决赛和决赛的枚举)与相关比赛相关联,以实现以下目的:
Dictionary<TournamentStage, IMatch> matches = new Dictionary<TournamentStage, IMatch>();
matches.Add(TournamentStage.Semifinal, new StandardMatch());
matches.Add(TournamentStage.Final, new FinalMatch());
问题在于IMatch是通用的,即使我想支持任何类型的匹配,我也必须指定一种类型。有C#经验的人可以提出解决问题的方法或更好的建模方法吗?
IMatch具有两个泛型,因为我使用这种方法对IPoomsae进行了建模:
public interface IPoomsae<R> where R : IPoomsaeResult
{
int MemberId { get; }
R Result { get; }
}
public interface IStandardPoomsae : IPoomsae<IStandardPoomsaeResult>
{
// Extra
}
public interface IFinalPoomsae : IPoomsae<IFinalPoomsaeResult>
{
// Extra
}
实际上,每个Poomsae都有一个与完成此操作的运动员相关的ID和一种结果(标准情况和最终情况都不同)。
答案 0 :(得分:1)
我建议不要尝试将不同类型的比赛变成一种(通用)比赛。相反,也许:
public class Tournament {
public Round Eliminatory;
public Round Semifinal;
public FinalRound Final;
}
我也不认为您也需要字典,尽管您可以考虑将上面的淘汰赛和半决赛更改为“预决赛”回合的列表或数组。在任何情况下,上面的方法都将类型分开,以便结果也可以分开。