2011-12-26 192 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