子类需要基类中的属性信息

时间:2011-12-26 23:18:18

标签: c# inheritance subclass base-class

以下是显示我尝试完成的代码。

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 个答案:

答案 0 :(得分: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中使用游戏逻辑)