【问题标题】:Many to Many relationship in object design对象设计中的多对多关系
【发布时间】:2011-02-09 18:22:17
【问题描述】:

我也有类似的问题:

Many to many object to object relation in C#

但是,假设锦标赛将有一个“Last Date Played”属性(仅作为示例)映射到任何参与者。在这种情况下,该财产最终会在哪里?是否必须创建一个中间类? (我不想这样做)我有什么选择?谢谢!

【问题讨论】:

  • 比赛日期是冠军还是参赛者的财产?所以:这是有人最后一次参加比赛,还是最后一次参加锦标赛(如年度赛事)
  • 假设它是参与者的属性,但它实际上与示例无关,属性可能在任一侧

标签: c# oop


【解决方案1】:

一种方法是在每个对象上创建一个数组,其中包含指向其他对象的指针,或者通过将对象存储为键并将日期存储为值的字典(或用于任意数量属性的自定义属性类)或使用包装器类围绕对象和一个普通列表,然后这个包装器应该实现装饰器模式以允许直接访问对象以及任何唯一属性。

包装器对象可以将内部对象用于在两个不同对象的相对包装器对象之间共享的属性,以便任何属性同步。

另一种方法是一个单独的对列表,其中一个像上面那样包装。

后者使得遍历所有对象变得容易。

这是一个代码示例,它可能不是您所需要的,但它可能会为您提供我的想法的基本知识。

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; }
    }   
}

【讨论】:

  • 我会试试的,先吃饭所以给我15分钟左右。
  • +1 表示字典。好主意,因为列表中只有独特的冠军。我们可以使用某种类型的 propertystruct 或某种多维数组。
  • 我的示例在 LinqPad 中进行了测试,因此 .Dump() 位于 main 的末尾;)
  • 这是我建议的想法之一,如果这不起作用,我可以稍后在孩子们睡觉时尝试做另一个例子。
猜你喜欢
  • 1970-01-01
  • 2010-11-07
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2011-05-01
  • 2010-12-07
相关资源
最近更新 更多