2011-12-26 38 views
1

下面是顯示我嘗試完成的代碼。子類需要基類中的屬性信息

public partial class Form1 : Form 
{ 
    public List<Player> Players { get; set; } 

    public Form1() 
    { 
     InitializeComponent(); 

     Players = new List<Player>(); 
     Players.Add(new Player() { ID = "Hero", Stack = 1000 }); 
     Players.Add(new Player() { ID = "Villain", Stack = 500 }); 

     MessageBox.Show(Players[0].Chipleader.ToString()); 
    } 
} 

public class Player 
{ 
    public string ID { get; set; } 
    public int Stack { get; set; } 
    public bool Chipleader 
    { 
     get 
     { 
      // Dependent on the stacks of the other players 
      return Stack == Players.Max(S => S.Stack); 
     } 
    } 
} 

我希望每個Player對象都有一個屬性「Chipleader」,如果該玩家有最大的堆棧,則表示該屬性爲true。玩家對象需要其他玩家的屬性(基類玩家列表)才能做到這一點。我需要此屬性在Player類中的原因是因爲我使用ObjectListView在列表視圖中列出了我的播放器對象。我希望有人能向我展示一個簡單/合乎邏輯的方式來做到這一點。

回答

5

通常,您的「遊戲」將管理哪個玩家處於領先地位,而不是其他玩家。爲了正常工作,讓一個類需要其他類的知識通常是一個糟糕的設計。

我,相反,建議有你的「遊戲」(形式)包含在鉛返回的玩家籌碼領先特性,即:

public Player Chipleader 
{ 
    get { return Players.OrderByDescending(s => s.Stack).FirstOrDefault(); } 
} 

如果你真的需要這個播放器上,使方法,像這樣:

public bool IsChipLeader(Form1 game) 
{ 
    // Maybe include check that "this" is part of the game... 
    return this.Stack == game.Players.Max(s => s.Stack); 
} 

(我也建議遊戲邏輯移動到它自己的「遊戲」類,並封裝在形式,而不必在Form1的遊戲邏輯)

+0

謝謝!不是我希望的答案,但它是有道理的。明天,我將嘗試製作一個事件,在堆棧更改時更新玩家的Chipleader屬性。 – Pizzaguru 2011-12-27 00:00:11