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

を?私はそれが信じています。 – Oded

+0

私はこのコードがコンパイルできるとは思いません - ここにタイプと同じ名前の変数があります 'public Tournament Tournament {get;セット; } ' – Hogan

+0

何かが継承されているだけで、グローバル/静的にはなりません。 – Hogan

答えて

5

あなたはトーナメントからPlayerを派生させるべきではありません。そうすることで、各プレイヤーはトーナメントであると言います。

このような何か試してみてください:なぜあなたはPlayer`は `Tournament`から` 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; } 
} 
1

継承は正常です。

私はyou'r問題はPlayerListは、おそらく空であるか、List内のすべてのPlayerのチップがゼロに等しく、したがって、合計はあまりにもゼロであるということだと思います。

それは理にかなっているかChipsが今までゼロすることができないようにPlayerListを移入ロジックを修正する場合StackPercentageChipsの可能性はゼロに等しい考慮してください。

EDIT:あなたの質問は編集されましたが、あなたが書いたコードはコンパイルされません。あなたのコードを明確にしない限り、あなたの問題は分かりません。この文句を言わない仕事とにかく

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インスタンスを作成するたびに、新しいTournament基本クラスのインスタンスが、対応するemtpy PlayerListで作成されることに注意してください。

ここで継承を使用しないでください。 PlayerTournamentには継承関係は全くありません。 PlayerTournamentではありません。継承関係の解消を取得し、単にTournamentクラスにStackPercentageを移動し、引数として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

新しいプレーヤーをインスタンス化するたびに、トーナメントのコンストラクターがトリガーされ、新しい空のプレイリストが作成されます。他のプレイヤーのスタックサイズに依存するプロパティ(Playerクラス内)を作成するにはどうすればよいですか? – Pizzaguru

+0

基本的に 'Player'は' Tournament'から継承していますので、 'Player'の新しいインスタンスが作成されるたびに' Tournament'の最初のコンストラクタが呼び出され、 'Player'のコンストラクタが呼び出されます。 'Tournament'のコンストラクタは' Player'インスタンスの 'PlayerList'を初期化します –

+0

インスタンス/クラス間で情報を共有したい場合は、この情報をパラメータで渡すか、すべてのクラス/インスタンスからアクセス可能なグローバル値を宣言できます –

関連する問題