C # наследование от родительского класса - PullRequest
2 голосов
/ 26 декабря 2011

Я хочу, чтобы мои объекты Player наследовали сумму фишек в Турнире.Я получаю (Попытка делить на ноль.), И я думаю, что это потому, что он не может наследовать чипы от родительского объекта Турнир.Почему это не работает?

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

Ответы [ 3 ]

6 голосов
/ 26 декабря 2011

Вы не должны выводить игрока из турнира.При этом вы говорите, что каждый игрок является турниром.

Попробуйте что-то вроде этого:

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 голос
/ 26 декабря 2011

Проблема в этом коде заключается в том, что вы предполагаете, что Tournament.PlayerList[0] будет указывать на тот же список игроков, что и экземпляр Tournament, но это не так.Коллекция PlayerList PlayerList[0] пуста.

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

Класс Player имеет свой собственный PlayerList.

1 голос
/ 26 декабря 2011

Наследование выглядит нормально.

Я думаю, что ваша проблема в том, что PlayerList, вероятно, пусто или чипы каждого Player в List равны нулю и, следовательно, сумма также равна нулю .

Сделайте так, чтобы 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();
}

В любом случае, это не сработает.Подробнее см. ответа Хариса Хасана.В основном tournament - это не тот же объект, что и (Tournament)PlayerList[0].Имейте в виду, что каждый раз, когда вы создаете экземпляр Player, создается новый экземпляр базового класса Tournament с соответствующим ему emtpy PlayerList.

Здесь вообще не следует использовать наследование.A Player и Tournament вообще не имеют наследственных отношений.A Player не является Tournament.Избавьтесь от отношения наследования и просто переместите StackPercentage в класс Tournament и преобразуйте его в метод, который принимает в качестве аргумента экземпляр Player:

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