2016-02-29 85 views
1

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

严重性代码说明项目文件的线路抑制状态 错误CS0120的对象引用需要非静态字段, 方法或属性“Rectangle.name”咕噜咕噜PATH \ Sign.cs 15主动

家长:

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; 

    } 
} 
} 

回答

1

你看到的问题源于这样的事实:Rectangle有一个构造函数 - 创建Rectangle实例的唯一方法是传递它的8个参数。

当你创建一个SignRectangle继承 - 因为它一个Rectangle - 它需要能够调用其Rectangle构造函数能够成功地构建自身。

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

您可以要求参数Sign,或在Sign构造硬编码他们:

public Sign(string message, string name, int id, float a, float b, float c, float d, int posX, int posY) 
    :base(name,id,a,b,c,d,posX,poxY) 

public Sign(string message) : base("a name", 1, 1, 2, 3, 4, 10, 10) 

例如。

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

必须要么使用一些更多的参数从构造函数传递参数

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; 

     } 
+0

在这里我想参数会自动传递给父类。谢谢。 – Theletos

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

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