从父类继承C#属性

从父类继承C#属性,c#,list,inheritance,parent,C#,List,Inheritance,Parent,我希望我的玩家对象继承锦标赛中的筹码总数。我得到(试图除以零),我认为这是因为它无法从父对象继承筹码。为什么这不起作用 public partial class Form1 : Form { public Tournament Tournament { get; set; } public Form1() { InitializeComponent(); Tournament = new Tournament(); To

我希望我的玩家对象继承锦标赛中的筹码总数。我得到(试图除以零),我认为这是因为它无法从父对象继承筹码。为什么这不起作用

public partial class Form1 : Form
{
    public Tournament Tournament { get; set; }

    public Form1()
    {
        InitializeComponent();

        Tournament = new Tournament();
        Tournament.PlayerList.Add(new Player("Hero", 5000));
        Tournament.PlayerList.Add(new Player("Villain1", 3000));
        Tournament.PlayerList.Add(new Player("Villain2", 4000));

        MessageBox.Show(Tournament.PlayerList[0].StackPercentage.ToString());
    }
}

public class Tournament
{
    public List<Player> PlayerList { get; set; }
    public int Chips
    {
        get
        {
            return PlayerList.Sum(S => S.Stack);
        }
    }

    public Tournament()
    {
        PlayerList = new List<Player>();
    }
}

public class Player : Tournament
{
    public string ID { get; set; }
    public int Stack { get; set; }
    public double StackPercentage
    {
        get
        {
            return Stack / Chips;
        }
    }

    public Player(string _ID, int _Stack)
    {
        ID = _ID;
        Stack = _Stack;
    }
}
公共部分类表单1:表单
{
公开锦标赛{get;set;}
公共表格1()
{
初始化组件();
锦标赛=新锦标赛();
锦标赛。玩家列表。添加(新玩家(“英雄”,5000));
锦标赛。玩家列表。添加(新玩家(“恶棍1”,3000));
锦标赛。玩家列表。添加(新玩家(“Villain2”,4000));
MessageBox.Show(Tornament.PlayerList[0].StackPercentage.ToString());
}
}
公开课比赛
{
公共列表播放列表{get;set;}
公共整数芯片
{
得到
{
返回PlayerList.Sum(S=>S.Stack);
}
}
公开赛()
{
PlayerList=新列表();
}
}
公开课选手:锦标赛
{
公共字符串ID{get;set;}
公共int堆栈{get;set;}
公共双重堆叠百分比
{
得到
{
返回堆栈/芯片;
}
}
公共播放器(字符串ID,整数堆栈)
{
ID=_ID;
堆栈=_堆栈;
}
}

继承似乎很好

我想你的问题是
玩家列表
可能是空的,或者
列表
中每个
玩家的筹码都等于零,因此总和也为零

使
StackPercentage
考虑
Chips
等于零的可能性(如果有意义),或修正填充
PlayerList
的逻辑,使
Chips
永远不能为零

编辑:您已经编辑了您的问题,但您编写的代码甚至无法编译……除非您澄清您的代码,否则我不确定您的问题是什么

试试这个:

public Form1()
{
    ....
    Tournament tournament = new Tournament();
    tournament.PlayerList.Add(new Player("Hero", 5000));
    tournament.PlayerList.Add(new Player("Villain1", 3000));
    tournament.PlayerList.Add(new Player("Villain2", 4000));
    int chips = tournament.PlayerList[0].StackPercentage.ToString();
}
无论如何,这是行不通的。详见答案。基本上,
锦标赛
(锦标赛)玩家列表[0]
不是同一个对象。请记住,每次创建
玩家
实例时,都会创建一个新的
锦标赛
基类实例,其中包含相应的emtpy
玩家列表

您不应该在这里使用继承。
玩家
锦标赛
根本没有继承关系。
玩家
不是
锦标赛
。摆脱继承关系,只需将
StackPercentage
移动到
锦标赛
类,并将其转换为一个方法,该方法将
玩家
实例作为参数:

  public double StackPercentage(Player player)
  {
       return player.Stack/this.Chips;
  }

此代码中的问题是您假设的是
锦标赛。玩家列表[0]
将指向与实例
锦标赛
正在执行的相同的玩家列表,但情况并非如此。
PlayerList[0]
的PlayerList集合为空

 public double StackPercentage
    {
        get
        {
            //Chips here is 0 because the PlayerList of Player instance is empty
            return Stack / Chips;
        }
    }

玩家类有自己的
玩家列表

您不应该从锦标赛中派生玩家。这样做,你是说每个球员都是一场比赛

试着这样做:

public interface IPlayer {}

public abstract class Player : IPlayer 
{
  public ITournament CurrentTournament { get; set; }
}

public class PokerPlayer : Player 
{
  public PokerPlayer() {}
  public int CurrentChips { get; set; }

  public double StackPercentage 
  {
    get { return this.CurrentChips / (PokerTournament)this.CurrentTournament.StartingChips; }
  }
}

public interface ITournament {}

public abstract class Tournament : ITournament
{
  public List<Player> Players { get; set; }
  public int PlayerCount { get { return this.Players.Count; } }
}

public class PokerTournament : Tournament 
{
  private PokerTournament() {}
  public PokerTournament(int startingChips)
  { 
    if(startingChips < 1) throw new ArgumentException("Invalid starting amount.", "startingChips");
    this.StartingChips = startingChips; 
  }

  public int StartingChips { get; set; }
}
公共接口IPlayer{}
公共抽象类播放器:IPlayer
{
公共iTournance CurrentTournament{get;set;}
}
公共级扑克玩家:玩家
{
公共扑克玩家(){}
公共int CurrentChips{get;set;}
公共双重堆叠百分比
{
获取{返回this.CurrentChips/(扑克锦标赛)this.currentTornament.StartingChips;}
}
}
公共接口ITournance{}
公开抽象类比赛:iTournant
{
公共列表玩家{get;set;}
public int PlayerCount{get{返回this.Players.Count;}}
}
公开课扑克锦标赛:锦标赛
{
私人扑克锦标赛(){}
公开扑克锦标赛(智力启动筹码)
{ 
如果(startingChips<1)抛出新的ArgumentException(“起始金额无效”,“startingChips”);
this.StartingChips=StartingChips;
}
公共int启动芯片{get;set;}
}

为什么你认为
玩家
不会从
锦标赛
继承
筹码
?我相信是的。我不相信这段代码可以编译——这里有一个与类型同名的变量
仅仅因为继承了某些东西,并不会使其成为全局/静态的。因此,每次我实例化一个新玩家时,它也会触发锦标赛的构造函数,并创建一个新的空玩家列表。我如何创建一个依赖于其他玩家堆栈大小的属性(在Player类中)?基本上
Player
是从
锦标赛
继承的,因此每当创建
Player
的新实例时,将调用
锦标赛的第一个构造函数
,然后调用
玩家的构造函数
锦标赛
的构造函数将初始化
玩家
实例的
玩家列表
如果您想在实例/类之间共享信息,您可以通过参数传递此信息,也可以声明一些可供所有类/实例访问的全局值很好地解决了“0计数”问题,但这不是真正的问题。继承是这里真正的问题所在,它导致了零计数问题。