Мне нужно смоделировать в C # контекст, связанный с соревнованиями по тхэквондо, где есть турнир, состоящий из большего количества матчей. В частности, по отношению к начальному количеству спортсменов турнир может состоять максимум из 3 матчей: отборочный, полуфинальный и финальный. В каждом матче я хочу отслеживать Poomsaes (своеобразную выставку атлетов), сделанную спортсменами. В отборочном матче или полуфинальном матче есть особый вид Poomsae с определенным ожидаемым результатом, отличающийся по типу от типа в финальном случае (другие параметры и т. Д.).
Итак, у меня есть интерфейс, который представляет общее совпадение (которое содержит Poomsaes, способные обрабатывать определенный тип PoomsaeResult). Из-за трудностей, связанных с наличием свойств с универсальными типами, я разделил концепцию на два метода.
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>
{
}
В классе «Турнир» мне хотелось бы иметь словарь, который связывает каждый этап турнира (перечисление Eliminatory, Semifinal и Final) с соответствующим матчем, чтобы достичь чего-то вроде этого:
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 имеет идентификатор, связанный с атлетом, который сделал это, и своего рода результат (который отличается для стандартного и финального случаев).