Обработка коллекции дженериков в C # - PullRequest
0 голосов
/ 05 ноября 2018

Мне нужно смоделировать в 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 имеет идентификатор, связанный с атлетом, который сделал это, и своего рода результат (который отличается для стандартного и финального случаев).

1 Ответ

0 голосов
/ 05 ноября 2018

Я бы предложил не пытаться объединять разные типы совпадений в один (общий) тип. Вместо этого возможно:

public class Tournament {
    public Round Eliminatory;
    public Round Semifinal;
    public FinalRound Final;
}

Я не думаю, что вам также нужен словарь, хотя вы могли бы рассмотреть вопрос об изменении Eliminator и Semifinal выше в список или массив "предфинальных" раундов. В любом случае, вышеизложенное разделяет типы, так что результаты также могут быть отдельными.

...