Функция базового класса вызывается, когда дочерняя функция должна переопределить - PullRequest
0 голосов
/ 29 апреля 2018

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

Точнее говоря, о temp2.setgetMoves (генерации), но только во второй раз, когда он используется для пьесы. Ошибка возникает потому, что я использовал наследование с виртуальным методом в родительском и метод переопределения в дочерних классах. Например, в родительском классе метод:

abstract class Piece
{
    String pieceType;
    int pieceVal;
    Panel piecePanel;


    public Piece(String type, int value, Panel image)
    {

        image.BackgroundImage = (Image)(Properties.Resources.ResourceManager.GetObject(type));

        pieceType = type;
        pieceVal = value;
        piecePanel = image;
    }

    public abstract List<Panel> setgetMoves(BoardGen board);

    public virtual List<Panel> getMoves()
    {
        return null;
    }

    public String getType()
    {
        return pieceType;
    }

    public void setPanel(Panel newPanel)
    {
        piecePanel = newPanel;
    }

    public Panel getPanel()
    {
        return piecePanel;
    }

    public int getValue()
    {
        return pieceVal;
    }
}

и в дочернем классе (например, это неполный пешечный класс, в нем еще нет ни кусочков, ни пассивов, ни продвижения, но это все, что я до сих пор получал) код:

class Pawn : Piece
{
    public List<Panel> possibleMoves;
    public Pawn(string type, int value, Panel image) : base(type, value, image)
    {

    }

    public override List<Panel> setgetMoves(BoardGen board)
    {
        possibleMoves = new List<Panel>();
        foreach (Panel x in board.getPanels())
        {
            if (this.getType().Substring(0, 1).Equals("W"))
            {
                if (this.getPanel().Location.Y == 240 && ((x.Location.Y == this.getPanel().Location.Y - 40) || (x.Location.Y == this.getPanel().Location.Y - 80)) && (x.Location.X == this.getPanel().Location.X))
                {
                    possibleMoves.Add(x);
                }

                else if((x.Location.Y == (this.getPanel().Location.Y - 40)) && (x.Location.X == this.getPanel().Location.X))
                {

                    possibleMoves.Add(x);
                }
            }
            else if (this.getType().Substring(0,1).Equals("B"))
            {
                if (this.getPanel().Location.Y == 40 && ((x.Location.Y == this.getPanel().Location.Y + 40) || (x.Location.Y == this.getPanel().Location.Y + 80)) && (x.Location.X == this.getPanel().Location.X))
                {
                    possibleMoves.Add(x);
                }
                else if (x.Location.Y == this.getPanel().Location.Y + 40 && (x.Location.X == this.getPanel().Location.X))
                {
                    possibleMoves.Add(x);
                }
            }
        }
        return possibleMoves;
    }

    public override List<Panel> getMoves()
    {
        return possibleMoves;
    }

Любая помощь в том, почему он не может переопределить второй раз, будет очень полезна. Спасибо.

1 Ответ

0 голосов
/ 29 апреля 2018

Поскольку в ответах на комментарии были обнаружены возможные проблемы X-Y, я хотел помочь исправить вашу функцию setPanel(). Надеемся, что это позволит вам повторно использовать существующие объекты правильного типа и избегать создания совершенно новых объектов, которые не имеют правильного типа (и, следовательно, не находят правильного переопределения).

Ваш конструктор изменяет свойство BackgroundImage аргумента Panel:

image.BackgroundImage = (Image)(Properties.Resources.ResourceManager.GetObject(type));

Поэтому, когда мы меняем панель, мы должны отменить наше предыдущее взаимодействие с исходной панелью и повторить ее для новой панели:

public void setPanel(Panel newPanel)
{
    newPanel.BackgroundImage = piecePanel.BackgroundImage;
    piecePanel.BackgroundImage = null;
    piecePanel = newPanel;
}
...