我一直在努力理解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”相对应的参数。
答案 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
}
}