C#继承和对象引用

时间:2016-02-29 21:30:00

标签: c# inheritance

我是C#的新手并试图弄清楚继承是如何工作的。我收到以下错误。为什么父参数必须是静态的?

  

严重级代码描述项目文件行抑制状态   错误CS0120非静态字段需要对象引用,   方法或属性'Rectangle.name'PurrS PATH \ Sign.cs 15 Active

父:

namespace PurrS.Maps
{
public class Rectangle
{
    protected string name;
    protected int id;
    protected float a;
    protected float b;
    protected float c;
    protected float d;
    protected int posX;
    protected int posY;
    //A----B
    //|    | 
    //C----D

    public Rectangle(string name, int id, float a, float b, float c, float d, int posX, int posY)
    {
        this.name = name;
        this.id = id;
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
    }

}
}

子:

namespace PurrS.Maps
{

public class Sign : Rectangle
{
    string message;

    public Sign(string message) 
        : base(name, id, a, b, c, d, posX, posY) { //This is where it fails.
        this.message = message;

    }
}
}

4 个答案:

答案 0 :(得分:2)

您必须从具有更多参数的构造函数传递参数

public Sign(string name, int id, float a, float b, float c, float d, int posX, int posY, string message)
                : base(name, id, a, b, c, d, posX, posY)
            { //This is where it fails.
                this.message = message;

            }

或提供一些默认的固定值:

        public Sign(string message)
            : base("foo", 1, 0, 0, 0, 0, 1, 1)
        { //This is where it fails.
            this.message = message;

        }

答案 1 :(得分:2)

您遇到的问题源于Rectangle只有一个构造函数的事实 - 创建Rectangle实例的唯一方法是将它传递给您8个参数。

当您创建一个继承自Sign的{​​{1}}时 - 因为 一个Rectangle - 它需要能够调用其Rectangle构造函数能够成功构建自己。

因此,在调用构造函数时,它需要所有可用的参数来调用Rectangle上的构造函数(你只有一个)。

您可以在Rectangle中询问参数,或在Sign构造函数中对其进行硬编码:

Sign

例如。

答案 2 :(得分:1)

您需要对此进行扩展:

public Sign(string message) 
    : base(name, id, a, b, c, d, posX, posY) { //This is where it fails.
    this.message = message;
}

将参数传递给基类,如下所示:

public Sign(string message, string name, int id, etc...) 
    : base(name, id, a, b, c, d, posX, posY) { 
    this.message = message;
}

答案 3 :(得分:0)

继承意味着您的子类(Sign类)将包含父类中的所有字段和方法。因此,你可以说

public Sign(string name, int id, float a, float b, float c, float d, int posX, int posY)
    {
        this.name = name;
        this.id = id;
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
    }

并且不必声明您正在使用的任何字段,因为它们是从父类继承的。