XSD абстрактные типы и полиморфизм - PullRequest
1 голос
/ 24 февраля 2011

Я пытаюсь смоделировать следующую ситуацию в схеме XSD, но вроде застрял и не уверен, поддерживает ли XSD то, чего я пытаюсь достичь.

У меня есть два сложных элемента, оба должны быть абстрактными:

  • Session
  • SessionResult

Их отношение: один сеанс может содержать ноль или более SessionResults

Тогда у меня есть эти другие сложные типы (не абстрактные):

  • RaceSession (наследуется от Session)
  • TimedSession (наследуется от Session)
  • RaceSessionResult (наследуется от SessionResult)
  • TimedSessionResult (наследуется от SessionResult)

Чего я хочу добиться, так это того, что когда Session имеет тип RaceSession, только элементы RaceSessionResult допускаются как SessionResult. Впоследствии, когда сеанс определяется как TimedSession, его элементы SessionResult должны иметь значение TimedSessionResult.

Сейчас я не могу добиться этого в XSD. Пока как обходной путь, я не определял SessionResult как список подэлементов Session. Сессия служит базой для TimedSession и RaceSession, и эти последние два имеют только элементы TimeSessionResult или RaceSessionResult соответственно.

Есть ли способ достичь того, что я описал выше в XSD? Цель состоит в том, чтобы генерировать из них классы c #.

Вот эквивалент C # того, что я пытаюсь сделать.

public class Event
{
    public List<Session> Sessions { get; set; }
}

public abstract class Session
{
    public string Weather { get; set; }
    public List<SessionResult> SessionResults { get; set; }
}

public abstract class SessionResult
{
    public int Position { get; set; }
}

public class RaceSession : Session
{
    public new List<RaceSessionResult> SessionResults { get; set; }
}

public class TimedSession : Session
{
    public new List<TimedSessionResult> SessionResults { get; set; }
}

public class RaceSessionResult : SessionResult
{
    public int StartPosition { get; set; }
}

public class TimedSessionResult : SessionResult
{
    public decimal BestLapTime { get; set; }
}

Спасибо огромное за любой вклад!

...