【问题标题】:Moving properties down from base class to child class将属性从基类下移到子类
【发布时间】:2019-06-07 12:28:48
【问题描述】:

我一直在努力理解 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. 

我为 pawn 创建了一个子类,但我似乎不明白构造函数如何工作得足够好来创建一个从父类继承属性的函数式..

  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”(我的构造函数)上显示错误

我怎么用错了?可以在构造函数中调用和分配属性,但是我应该在 () 中包含哪些值......例如。 Pawn(int value, int value 2, int propertyName, etc)

我现在已经看了一百个教程视频,但我还是不明白。我希望我正在努力完成的事情甚至是有意义的!

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

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

【问题讨论】:

  • 就像我不明白为什么它需要更多参数。我应该在 pawn 类中的其他地方初始化它吗?
  • firstMove 定义在哪里?错误信息是什么?
  • 错误信息是什么?
  • 将鼠标悬停在红线上,告诉我们工具提示中显示的消息是什么。
  • 其他一些想法,在等待该信息时...考虑将 Piece 类抽象化,因为它只是一个基类,您不会期望创建该类型的类,只是派生类型。同样,其中的私有字段可以更改为受保护:然后Pawn类可以直接从构造函数中设置字段,而不是通过属性设置器(即bad idea

标签: c# oop inheritance parent


【解决方案1】:

我在评论中写过:我敢打赌Piece 有一个构造函数(需要参数),你没有向我们展示,所以它抱怨基类上没有合适的构造函数。

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

如果你编写一个没有任何构造函数的类,你的类会被赋予一个没有参数的默认构造函数。如果添加构造函数,则不会添加默认构造函数 - 如果需要,需要自己编写。

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

问题中代码的问题在于派生类的构造函数没有指定使用哪个基类构造函数,并且由于基类没有默认构造函数,所以该语句无效。

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

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

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

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

从报错信息看,应该叫StepsLeft, StepsRight。

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

但是你不能将你的属性或字段传递给基础构造函数,因为你的类还没有被构造!

【讨论】:

  • 非常感谢您让我继续前进,@Richardissimo 我对这些 oop 概念的理解非常缓慢。即使一旦你掌握了它,它看起来真的很有趣。查看我更新的代码,让我知道你的想法。
【解决方案2】:

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

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


}

现在,孩子们不再抱怨了。 我要去一个编码训练营,希望能在这里整理出更多的基础知识!谢谢你们的投入!

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这似乎不正确。以下代码对我来说编译得很好:public class Piece { } internal class Pawn : Piece { public Pawn() { } }.
    • 请不要破坏您的答案。如果你愿意,你可以简单地删除你的答案。
    • 我刚刚用以下承包商更新了它: public class Piece // // 使用 'T' 作为下面所有的通用变量- { public Piece() { } 看起来现在开始工作。我想我记得听说过默认/隐含/初始构造函数被初始化为内部的。身份证。它现在似乎正在工作。我只是不确定是否应该在构造函数中包含私有字段:/
    • 实际上显然不是。我刚试了一下,整个文件都亮了红色。
    猜你喜欢
    • 2013-11-13
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多