OOP拼图。俱乐部和俱乐部的球员与球员

时间:2012-12-04 22:15:20

标签: .net oop class object

我不知道这是不是正确的地方。但我非常需要回答。

我正在为锦标赛管理编写程序。我有一个简单的问题但对我而言并不是那么清楚。

有很多俱乐部(一个城市的一个俱乐部)。俱乐部里有球员。没有没有俱乐部的球员。

我有Player级和Club级。 我应该保留俱乐部课程中的球员名单还是让球员俱乐部继续上课? 哪种方式会更好?

4 个答案:

答案 0 :(得分:1)

这取决于您需要如何使用数据。

  • 如果您需要能够Player中的所有Club,那么您的Club课程应保留Player的列表。
  • 如果您需要能够获得特定Club所属的Player,那么Player类应该保留Club变量。
  • 如果您需要两者,请同时使用两者,但确保在更改时保持同步。

为了使它们保持同步,您基本上需要每个方法的两个不同版本。第一个版本(“公共”版本)自动处理呼叫的副作用并同步两个表示。第二个版本是第一个版本调用获取的版本。它不会执行任何同步,因为这会导致无限循环。

类似于以下内容:

  • Club.AddPlayer(播放器播放器,布尔同步=真)
    1. player添加到此俱乐部的播放器列表中。
    2. 如果同步:
      1. 致电RemovePlayer(player,false)现有分会的player
      2. SetClub(this,false)上致电player
  • Club.RemovePlayer(播放器播放器,布尔同步=真)
    1. 从此俱乐部的播放器列表中删除player
    2. 如果同步:
      1. 致电player.SetClub(null,false)
  • Player.SetClub(俱乐部俱乐部,布尔同步=真)
    1. 将玩家的俱乐部设置为club
    2. 如果同步:
      1. 如果玩家俱乐部不是null,请拨打RemovePlayer(this,false)
      2. 如果club不是null,请在其上调用AddPlayer(this,false)`。

这似乎不必要地笨重,所以我希望别人有更好的主意......: - )

答案 1 :(得分:1)

由于每位玩家都有俱乐部,因此请保留俱乐部课程中的玩家列表。这使得枚举或搜索给定俱乐部中的所有玩家变得快速而简单。但是,没有理由你不能在Player类中引用指向其父级Club的引用。有两个方向都有链接的有效用例,两者都有。

我假设每个玩家只能属于一个俱乐部。如果不是这样的话,情况会变得复杂一些。

C#中的一个例子:(未编译/测试,因此可能有一些小错误)

public class Club
{
   // other class members

   // this is private so that code must use Club's methods to get at the Players
   private List<Player> _players;

   public int PlayerCount
   {
      get
      {
         return _players == null ? 0 : _players.Count;
      }
   }

   public void AddPlayer(Player p)
   {
      // null checking etc
      // here you could enforce a rule that p.ParentClub must be null
      // to prevent a Player from being in multiple Clubs
      p.ParentClub = this;
      _players.Add(p);
   }

   public void RemovePlayer(Player p)
   {
      // null checking etc
      _players.Remove(p);
      p.ParentClub = null;
   }
}

public class Player
{
   // other class members

   public Club ParentClub 
   { get; set; }
}

现在,您可以这样做:

// add Player Joe to the London Club if it is not full (10 members max)
// otherwise add Joe to the Munich Club
if(londonClub.PlayerCount <= 10)
{
   londonClub.AddPlayer(joePlayer);
}
else
{
   munichClub.AddPlayer(joePlayer);
}

// print how many players are in the club that Joe is in
Console.WriteLine("Number of Players in Joe's Club: " + joePlayer.ParentClub.PlayerCount.ToString());

// move Joe to the Amsterdam club. Note that it does not matter what Club Joe was already in
joePlayer.ParentClub.RemovePlayer(joePlayer);
amsterdamClub.AddPlayer(joePlayer);

答案 2 :(得分:1)

如果您使用依赖注入,那么答案是,您同时执行这两项操作。在俱乐部中,您有一个阵列结构,其中包含一系列玩家关注点。在玩家中,你有一个存储俱乐部对象的俱乐部变量。

答案 3 :(得分:0)

您可以根据目的双向链接。使用list<int> PlayerIds和具有int ClubId的播放器类对俱乐部类进行编码,并根据操作使用。

例如,如果您显示俱乐部页面更容易使用俱乐部课程,如果您显示播放器页面更容易使用播放器课程。