无法访问继承的全局变量

时间:2016-05-23 15:19:21

标签: c# inheritance

我正在写一个小程序,应该从正方形底座创建不同形状的房间。这些形状应该从正方形继承,其中包含顶点的列表。

Room(父类)代码:

class Room
{
    private List<Point> vertices;
    private int oX;
    private int oY;
    private int width;
    private int height;

    public Room(int oX, int oY, int width, int height)
    {
        vertices = new List<Point>();
        addVertice(new Point(oX, oY));
        addVertice(new Point(oX + width, oY));
        addVertice(new Point(oX, oY + height));
        addVertice(new Point(oX + width, oY + height));

        this.width = width;
        this.height = height;
   }
}

然后我从LShape继承Room,但Visual Studio表示由于其保护级别而无法访问 vertices 变量。

LShape(子)类的代码

class LShape: Room
{
    public LShape(int oX, int oY, int width, int height, List<Point> verticesList)
    {
        vertices = verticesList;
    }
}

根据我发现的所有教程,这应该有效,即使父母的成员是私人的。

有人可以向我解释我的错误在哪里,或者我在哪里误解了这些概念?另外如果你有关于继承的任何好的教程,我会很感激。

谢谢。

2 个答案:

答案 0 :(得分:9)

  

根据我发现的所有教程,这应该有效,即使父母的成员是私人的。

不,私人成员只能在声明类型的程序文本中访问。因此,如果您在LShape中将Room声明为嵌套类型,那么这将有效 - 但否则不会。如果它是protected成员,你可以访问它,但我建议保持private,说实话 - 相反,将顶点传递给构造函数。

请注意,您的LShape构造函数也需要链接到Room中的可访问构造函数(或其他LShape构造函数),但最终它必须链接到{{ 1}})。

答案 1 :(得分:5)

那是因为您将vertices声明为private

private List<Point> vertices;

private表示仅声明类型(或嵌套在此类型中的类型)可以访问此字段。如果要通过继承类来访问此字段,则需要将其声明为protected

protected List<Point> vertices;

有关详细信息,请参阅C# access modifiers