将属性从基类移到子类

时间:2019-01-13 03:43:43

标签: c# oop inheritance parent

我一直在努力理解OOP的一些基础知识。 我正在通过创建一个国际象棋游戏进行练习,在该游戏中,我创建了一个初始化所有棋子的所有移动属性的类。

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在单词'Pawn'(我的构造函数)上显示错误

我怎么用这个错?可以在构造函数中调用和分配属性,但是我应该在()的.. ex中包括哪些值。典当(整数值,整数值2,整数propertyName等)

我现在已经看了一百个教学视频,但是我还是听不懂。我希望我要完成的工作甚至有意义!

悬停在红线上,实际的错误消息是:

  

没有给出与“ Piece.Piece(int,int)”的所需形式参数“ StepsLeft”相对应的参数。

3 个答案:

答案 0 :(得分:0)

很显然,基类需要一个“已写完”的构造函数,并且需要一个公共访问标识符来完成这项工作。我已经更新了代码以包括:

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


}

现在孩子班级了,不再抱怨了。 我要去编码训练营,在那里我希望可以整理出更多的基础知识!谢谢大家的投入!

答案 1 :(得分:0)

我在评论中写道:我敢打赌,Piece具有您没有向我们展示的构造函数(需要参数),因此它抱怨基类上没有合适的构造函数

OP已确认这正是问题所在。 Piece类的构造函数采用两个int。所以让我解释一下...

如果编写的类没有任何构造函数,则为您的类提供默认构造函数,且不带参数。如果添加了构造函数,则不会添加该默认构造函数-如果需要,则需要自己编写。

构造函数的目的是说明构造该类时必须给出的值

问题代码的问题在于,派生类的构造函数未指定要使用的基类构造函数,并且由于基类没有默认构造函数,因此该语句无效。

您可以像这样使构造函数有效...

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

将使用基类的构造函数,将值1和2传递给基类构造函数的两个int参数(可能不是您所需要的,但我将展示您的选项)。或者,您可以将参数添加到Piece构造函数中,并在以下变量中传递这些变量名称:

public Pawn(not first, int second)
    : base (first, second)
{
错误消息中的

,看起来它们将被称为StepsLeft,StepsRight。

或者您可以将默认构造函数添加到基类(如果可以接受的话),在这种情况下,无需更改Pawn代码。

但是您不能将属性或字段传递给基本构造函数,因为尚未构造您的类!

答案 2 :(得分:-1)

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