2011-12-26 130 views
2

我想让我的Player对象继承锦标赛中的筹码总和。我得到(试图除以零),我认为这是因为它无法从父锦标赛对象继承芯片。为什么这不起作用?C#继承父类的属性

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; 
    } 
} 
+0

为什么你认为'Player'不继承从''Tournament' Chips'?我相信它的确如此。 – Oded 2011-12-26 14:26:29

+0

我不相信这个代码可以编译 - 你有一个与这里类型相同的变量'public Tournament Tournament {get;组; }' – Hogan 2011-12-26 14:28:15

+0

仅仅因为某些东西被继承了,并不能使它成为全局/静态的。 – Hogan 2011-12-26 14:29:34

回答

5

你不应该从锦标赛派生玩家。通过这样做,你就是说每个球员都是比赛。

尝试这样:

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; } 
} 
1

继承似乎很好。

我觉得找你的问题是,PlayerList可能是空的或ListPlayer的芯片等于,因此总和是零

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(); 
} 

反正这不会工作。详情请见Haris Hasan's回答。基本上tournament(Tournament)PlayerList[0]不是同一个对象。请记住,每次创建Player实例时,都会创建一个新的基类实例,其相应的模式为PlayerList

你不应该在这里使用继承。 A PlayerTournament完全没有继承关系。 A Player不是Tournament。摆脱了继承关系的,只是移动StackPercentageTournament类,并将其转换成需要Player实例作为参数的方法:

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

问题在这段代码是我们假定你是Tournament.PlayerList[0]将指向相同球员列表作为实例Tournament正在做,但事实并非如此。 PlayerList[0]的PlayerList集合是空的。

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

Player类拥有它自己的PlayerList

+0

因此,每次我实例化一个新玩家时,它也会触发Tournament的构造函数并创建一个新的空白玩家列表。我如何制作一个属性(在玩家类中),依赖于其他玩家的堆叠大小呢? – Pizzaguru 2011-12-26 15:43:39

+0

基本上'Player'从'Tournament'继承,所以无论何时创建一个新的'Player'实例,都会调用Tournament的第一个构造函数,然后调用Player的构造函数。 'Tournament'的构造函数将'PlayerList'初始化为'Player'实例 – 2011-12-26 15:47:26

+0

如果你想在实例/类之间共享信息,你可以通过参数传递这个信息,或者你可以声明一些全局值,所有类/实例都可以访问 – 2011-12-26 15:49:40