我正在写一个小程序,应该从正方形底座创建不同形状的房间。这些形状应该从正方形继承,其中包含顶点的列表。
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;
}
}
根据我发现的所有教程,这应该有效,即使父母的成员是私人的。
有人可以向我解释我的错误在哪里,或者我在哪里误解了这些概念?另外如果你有关于继承的任何好的教程,我会很感激。
谢谢。
答案 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。