从父类继承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计数”问题,但这不是真正的问题。继承是这里真正的问题所在,它导致了零计数问题。