2011-12-26 7 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オブジェクトには、そのプレーヤーが最も大きなスタックを持っている場合にtrueを示すプロパティ "Chipleader"が必要です。プレイヤーオブジェクトはこれを行うために、他のプレーヤー(基本クラスのプレーヤーのリスト)のプロパティを必要とします。 Playerクラスにこのプロパティが必要な理由は、リストビューでプレーヤーオブジェクトを表示するためにObjectListViewを使用しているためです。私は誰かが私にこれを行う簡単な/論理的な方法を示すことができることを願っています。

答えて

5

一般的に、あなたの「ゲーム」は、他のプレイヤーではなく、どのプレイヤーがリードしているかを管理します。クラスを正しく機能させるためには、他のクラスの知識を必要とするのは、通常、悪い設計です。

私は、代わりに、あなたの「ゲーム」(フォームが)、すなわち、リードでプレイヤーを返さChipleaderプロパティが含まれていたことをお勧め:

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

関連する問題