2011-12-26 3 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); 
     } 
    } 
} 

는 내가 그 선수가 가장 큰 스택이있는 경우 모든 플레이어 객체가 true를 나타내는 속성을 "칩 리더"를 갖고 싶어. 플레이어 개체는이를 수행 할 수 있도록 다른 플레이어 (기본 클래스의 플레이어 목록)의 속성을 필요로합니다. 이 속성이 Player 클래스에 있어야하는 이유는 ObjectListView을 사용하여 listview에서 플레이어 개체를 나열하기 때문입니다. 누군가가 나에게이 일을 간단하게/논리적으로 보여줄 수 있기를 바랍니다.

답변

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

+0

감사합니다 (I는 또한 자신의 "게임"클래스로 게임 로직을 이동 권하고 싶습니다, 대신를 Form1의 게임 로직을 필요없이 형태로 그 캡슐화) ! 내가 원했던 대답이 아니라 그것이 합리적입니다. 내일 Stack이 변경 될 때마다 플레이어의 Chipleader 속성을 업데이트하는 이벤트를 만들려고합니다. – Pizzaguru

관련 문제