将属性从基础 class 向下移动到子 class
Moving properties down from base class to child class
我一直在努力理解 OOP 的一些基础知识。
我正在通过创建一个国际象棋游戏来练习,我在其中创建了一个 class 来初始化所有棋子的所有运动属性。
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.
我为 pawns 创建了一个子 class,但我似乎不明白构造函数如何工作得足够好,无法创建一个从父元素继承属性的函数。
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 中包含哪些值。 Pawn(int value, int value 2, int propertyName, etc)
我现在已经看了一百个教程视频,但我还是不明白。我希望我想要完成的事情是有道理的!!
鼠标悬停在红线上,实际报错信息为:
There is no argument given that corresponds to the required formal parameter 'StepsLeft' of 'Piece.Piece(int, int)'
Visual Studio 抛出错误,因为您在 Pawn class 上没有访问修饰符,但您将构造函数设置为 public。
如果不指定访问修饰符,则默认为内部。有一个 class 是内部的,然后试图有一个 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
}
}
显然,基础 class 需要一个 "written-out" 构造函数和一个 public 访问标识符来完成这项工作。我更新了代码以包括:
public class Piece //<T> // using ' T ' as the generic variable of all the below-
{
public Piece()
{
}
和childclass现在,不再抱怨了。
我要去编码训练营,希望在那里我可以整理出更多的基础知识!谢谢你们的投入!
我在评论里写过:我打赌Piece
有一个你没有给我们看的构造函数(需要参数),所以它抱怨没有合适的构造函数在基地 class.
OP 已确认这正是问题所在。 Piece
class 有一个带两个 int
的构造函数。那么让我解释一下...
如果你写的 class 没有任何构造函数,你的 class 会得到一个默认构造函数,没有参数。如果你添加一个构造函数,那么那个默认的构造函数将不会被添加——如果你想要它,你需要自己写。
构造函数的目的是说明在构造 class 时必须 给出什么值。
题中代码的问题是派生class的构造函数没有指定使用哪个基class构造函数,并且由于基class没有默认构造函数,语句无效。
您可以像这样使构造函数有效...
public Pawn()
: base (1, 2)
{
这将使用基础 class 的构造函数,将值 1 和 2 传递给基础 class 构造函数的两个 int
参数(可能不是您需要的,但是我正在展示你的选择)。或者您可以将参数添加到 Piece
构造函数,并将这些变量名称传递给:
public Pawn(not first, int second)
: base (first, second)
{
从错误消息来看,它们应该被称为 StepsLeft、StepsRight。
或者您可以将默认构造函数添加到基础 class 上(如果可以接受的话),在这种情况下无需更改 Pawn
代码。
但是您不能将您的属性或字段传递给基本构造函数,因为您的 class 尚未构造!
我一直在努力理解 OOP 的一些基础知识。 我正在通过创建一个国际象棋游戏来练习,我在其中创建了一个 class 来初始化所有棋子的所有运动属性。
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.
我为 pawns 创建了一个子 class,但我似乎不明白构造函数如何工作得足够好,无法创建一个从父元素继承属性的函数。
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 中包含哪些值。 Pawn(int value, int value 2, int propertyName, etc)
我现在已经看了一百个教程视频,但我还是不明白。我希望我想要完成的事情是有道理的!!
鼠标悬停在红线上,实际报错信息为:
There is no argument given that corresponds to the required formal parameter 'StepsLeft' of 'Piece.Piece(int, int)'
Visual Studio 抛出错误,因为您在 Pawn class 上没有访问修饰符,但您将构造函数设置为 public。
如果不指定访问修饰符,则默认为内部。有一个 class 是内部的,然后试图有一个 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
}
}
显然,基础 class 需要一个 "written-out" 构造函数和一个 public 访问标识符来完成这项工作。我更新了代码以包括:
public class Piece //<T> // using ' T ' as the generic variable of all the below-
{
public Piece()
{
}
和childclass现在,不再抱怨了。 我要去编码训练营,希望在那里我可以整理出更多的基础知识!谢谢你们的投入!
我在评论里写过:我打赌Piece
有一个你没有给我们看的构造函数(需要参数),所以它抱怨没有合适的构造函数在基地 class.
OP 已确认这正是问题所在。 Piece
class 有一个带两个 int
的构造函数。那么让我解释一下...
如果你写的 class 没有任何构造函数,你的 class 会得到一个默认构造函数,没有参数。如果你添加一个构造函数,那么那个默认的构造函数将不会被添加——如果你想要它,你需要自己写。
构造函数的目的是说明在构造 class 时必须 给出什么值。
题中代码的问题是派生class的构造函数没有指定使用哪个基class构造函数,并且由于基class没有默认构造函数,语句无效。
您可以像这样使构造函数有效...
public Pawn()
: base (1, 2)
{
这将使用基础 class 的构造函数,将值 1 和 2 传递给基础 class 构造函数的两个 int
参数(可能不是您需要的,但是我正在展示你的选择)。或者您可以将参数添加到 Piece
构造函数,并将这些变量名称传递给:
public Pawn(not first, int second)
: base (first, second)
{
从错误消息来看,它们应该被称为 StepsLeft、StepsRight。
或者您可以将默认构造函数添加到基础 class 上(如果可以接受的话),在这种情况下无需更改 Pawn
代码。
但是您不能将您的属性或字段传递给基本构造函数,因为您的 class 尚未构造!