Подкласс требует информацию о недвижимости в базовом классе - PullRequest
1 голос
/ 27 декабря 2011

Вот код, который показывает, что я пытаюсь выполнить.

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 для перечисления объектов своего игрока в виде списка.Я надеюсь, что кто-то может показать мне простой / логичный способ сделать это.

1 Ответ

5 голосов
/ 27 декабря 2011

Как правило, ваша «игра» будет определять, какой игрок лидирует, а не другие игроки.Как правило, плохой дизайн - иметь класс, требующий знания других классов для правильной работы.

Вместо этого я бы предложил, чтобы ваша "игра" (форма) содержала свойство Chipleader, возвращающее игрока впреимущество, например:

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

Если вам действительно нужно это в Player, создайте метод, например, так:

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

(я бы также рекомендовал переместить логику игрысобственный класс "Game" и инкапсулировать его в форму вместо логики игры в Form1)

...