2011-02-09 3 views
0

У меня есть аналогичные проблемы, как это:отношения многие ко многим в предметном дизайне

Many to many object to object relation in C#

Однако, представьте себе, что чемпионат будет иметь «Последняя Дата Играемый» Свойство (только в качестве примера), что бы карту для любого Участника. В этом случае, где будет это свойство? Нужно ли создавать промежуточный класс? (что я бы не хотел делать), какой у меня вариант? благодаря!

+0

Является ли данная дата собственностью чемпионата или участника? Итак: в последний раз, когда кто-то играл, или в последний раз, когда был проведен чемпионат (например, годовое событие) – Marnix

+0

, предположим, что это свойство участника, но это действительно не относится к примеру, свойство может быть с обеих сторон –

ответ

2

Одним из способов было бы иметь массив для каждого объекта, содержащий указатели на другие объекты, либо через словарь, который хранит объект как ключ и дату как значение (или собственный класс свойств для любого количества свойств), либо используя обертки вокруг объекта и простой список, эта оболочка должна затем реализовать шаблон декоратора, чтобы обеспечить прямой доступ к объекту вместе с любыми уникальными свойствами.

Объект-обертка может использовать внутренний объект для свойств, которые совместно используются между оберточными объектами-опорами для двух разных объектов, так что любое свойство синхронизируется.

Другим способом может быть отдельный список пар, в которых один обернут, как указано выше.

Позже упрощается переключение по всем объектам.

Вот пример кода, это может быть не совсем то, что вам нужно, но оно может дать вам основы моей идеи.

void Main() 
{ 
    var p = new Player("David"); 
    var c = new Championship("Chess"); 
    p.LinkChampionship(c, DateTime.Now); 

    p.Dump(); 
} 

// Define other methods and classes here 

class Player : Properties { 
    public virtual String Name {get; set;} 
    public List<ChampionshipWrapper> champs = new List<ChampionshipWrapper>(); 

    public Player() { 
    } 
    public Player(string name) { 
     Name = name; 
    } 
    public void LinkChampionship(Championship champ, DateTime when) { 
     var p = new Properties(when); 
     champs.Add(new ChampionshipWrapper(champ, p)); 
     champ.players.Add(new PlayerWrapper(this, p)); 
    } 
} 

class Championship : Properties { 
    public virtual String Name { get; set; } 
    public List<PlayerWrapper> players = new List<PlayerWrapper>(); 

    public Championship(){} 
    public Championship(string name) { 
     Name = name; 
    } 

    public void LinkPlayer(Player play, DateTime when) { 
     var p = new Properties(when); 
     players.Add(new PlayerWrapper(play, p)); 
     play.champs.Add(new ChampionshipWrapper(this, p)); 
    } 
} 

class Properties { 
    public virtual DateTime LastPlayed { get; set; } 
    public Properties() { 
    } 
    public Properties(DateTime when) { 
     LastPlayed = when; 
    } 
} 

class PlayerWrapper : Player { 
    private Player player; 
    private Properties props; 

    public PlayerWrapper(Player play, Properties prop) { 
     this.player = play; 
     this.props = prop; 
    } 

    public override String Name { 
     get { return this.player.Name; } 
     set { this.player.Name = value; } 
    } 

    public override DateTime LastPlayed { 
     get { return this.props.LastPlayed; } 
     set { this.props.LastPlayed = value; } 
    } 
} 

class ChampionshipWrapper : Championship { 
    private Championship champ; 
    private Properties props; 

    public ChampionshipWrapper(Championship c, Properties prop) { 
     this.champ = c; 
     this.props = prop; 
    } 

    public override String Name { 
     get { return this.champ.Name; } 
     set { this.champ.Name = value; } 
    } 

    public override DateTime LastPlayed { 
     get { return this.props.LastPlayed; } 
     set { this.props.LastPlayed = value; } 
    } 
} 
+0

Можете ли вы предоставить пример кода? –

+0

Я попробую, просто поеду первым, дайте мне 15 минут или около того. –

+0

+1 для словаря. Хорошая идея, потому что в списке есть только уникальные чемпионаты. Возможно, мы могли бы использовать правильную структуру или какой-то многомерный массив. – Marnix

Смежные вопросы