Перемещение свойств из базового класса в дочерний класс - PullRequest
0 голосов
/ 13 января 2019

Я изо всех сил пытался понять некоторые из основ ООП. Я тренируюсь, создавая игру в шахматы, в которой я создаю класс, который инициализирует все свойства движения всех фигур.

public class Piece  //<T> // using ' T '  as the generic variable of all the below- 
{

    //Movement of all pieces are constructed from this properties of this base class ('Piece')- 
    private int StepsLeft;
    private int StepsRight;
    private int StepsUp;
    private int StepsBack;
    //Diaganols: 
    private int DiagTopL;
    private int DiagTopR;
    private int DiagBotL;
    private int DiagBotR;
    public int StartPositionVert; // Vertical starting value: '1 thru 8'     -
    public string StartPositionHoriz; // Horizontal starting value: ' a thru h' -

    //property 
    public int Left{
        get { return StepsLeft; }
        // Setting it equal to 'T' ?
        set {             
            Left = StepsLeft; }
    }
    public int Right
    {
        get { return StepsRight; }
        // Setting it equal to 'T' ?
        set { Right = StepsRight; }
    }
    public int Up
    {
        get { return StepsUp; }
        // Setting it equal to 'T' ?
        set { Up = StepsUp; }
    }
     public int etc. 

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

  class Pawn : Piece
{ // class for a single pawn piece

    public Pawn() //   << RED SYNTAX ERROR RIGHT HERE
    {
        bool FirstMove = true;
        Left = 0;
        Right = 0;
        Up = 2;  //< start it at two?-
        Back = 0;
        DTopLeft = 0; //start these off at zero- 
        DTopRight = 0; // - ^ 
        DBotLef = 0;  // < always -0-
        DBotRite = 0; //  < always -0-
    }
    public override void Move()
    {
        base.Move();// <<==- replace
    }
}

Visual Studio показывает ошибку прямо над словом «Пешка» (мой конструктор)

Как я использую это неправильно? Свойства могут быть вызваны и назначены в конструкторе, но какие значения я должен включить в () в. Ex. Пешка (int-значение, int-значение 2, int propertyName и т. Д.)

Я посмотрел сотню обучающих видео, но до сих пор не понимаю. Я надеюсь, что то, что я пытаюсь достичь, даже имеет смысл !!

При наведении курсора на красную линию появляется сообщение об ошибке:

Не указан аргумент, соответствующий необходимому формальному параметру 'StepsLeft' в Piece.Piece (int, int) '

Ответы [ 3 ]

0 голосов
/ 14 января 2019

очевидно, базовому классу требовался "выписанный" конструктор с идентификатором открытого доступа. Я обновил код для включения:

    public class Piece  //<T> // using ' T '  as the generic variable of all the below- 
{
    public Piece()
    {


}

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

0 голосов
/ 14 января 2019

Я написал в комментарии: Моя ставка в том, что Piece имеет конструктор (требующий параметров), который вы нам не показали, поэтому он жалуется, что в базовом классе нет подходящего конструктора.

ОП подтвердил, что именно в этом и была проблема. Класс Piece имеет конструктор, принимающий два int с. Итак, позвольте мне объяснить ...

Если вы пишете класс без каких-либо конструкторов, ваш класс получает конструктор по умолчанию без параметров. Если вы добавите конструктор, то этот конструктор по умолчанию не будет добавлен - если вы хотите его, вам нужно написать его самостоятельно.

Цель конструктора - сказать, какие значения должны быть указаны при создании этого класса.

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

Вы можете сделать конструктор действительным вот так ...

public Pawn()
    : base (1, 2)
{

Который будет использовать конструктор базового класса, передавая значения 1 и 2 двум int параметрам конструктора базового класса (возможно, не то, что вам нужно, но я демонстрирую ваши опции). Или вы можете добавить параметры в ваш Piece конструктор и передать имена этих переменных в:

public Pawn(not first, int second)
    : base (first, second)
{

из сообщения об ошибке, похоже, что они будут называться StepsLeft, StepsRight.

Или вы можете добавить конструктор по умолчанию в базовый класс (если это приемлемо), и в этом случае нет необходимости изменять код Pawn.

Но вы не можете передать свои свойства или поля в базовый конструктор, потому что ваш класс еще не создан!

0 голосов
/ 13 января 2019

Visual Studio выдает ошибку, потому что у вас нет модификатора доступа в вашем классе Pawn, но вы устанавливаете конструктор как public.

Если вы не укажете модификатор доступа, по умолчанию используется внутреннее значение. Причиной вашей проблемы является наличие внутреннего класса, а затем попытка создать открытый конструктор.

public  class Pawn : Piece
{ // class for a single pawn piece

    public Pawn() //   << RED SYNTAX ERROR RIGHT HERE
    {
        bool FirstMove = true;
        Left = 0;
        Right = 0;
        Up = 2;  //< start it at two?-
        Back = 0;
        DTopLeft = 0; //start these off at zero- 
        DTopRight = 0; // - ^ 
        DBotLef = 0;  // < always -0-
        DBotRite = 0; //  < always -0-
    }
    public override void Move()
    {
        base.Move();// <<==- replace
    }
}
...