【问题标题】:Sub class requires info of property in base class子类需要基类中的属性信息
【发布时间】:2012-01-28 05:11:45
【问题描述】:

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

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 在列表视图中列出我的播放器对象。我希望有人可以向我展示一种简单/合乎逻辑的方法。

【问题讨论】:

    标签: c# inheritance subclass base-class


    【解决方案1】:

    通常,您的“游戏”会管理领先的玩家,而不是其他玩家。让一个类需要其他类的知识才能正常运行通常是一种糟糕的设计。

    相反,我建议让您的“游戏”(表单)包含一个 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);
    }
    

    (我还建议将游戏逻辑移到它自己的“游戏”类中,并将其封装在表单中,而不是将游戏逻辑放在 Form1 中)

    【讨论】:

    • 谢谢!不是我希望的答案,但它是有道理的。明天我将尝试创建一个事件,该事件将在 Stack 发生变化时更新玩家的 Chipleader 属性。
    猜你喜欢
    • 1970-01-01
    • 2017-04-07
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    相关资源
    最近更新 更多