我是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;
}
}
}
答案 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;
}
并且不必声明您正在使用的任何字段,因为它们是从父类继承的。