我有两个班。这是我的代码:
//My Base class
public class People
{
public People()
{
}
protected string name;
protected string Name
{
get
{
return this.name;
}
set
{
this.name = value;
}
}
}
//The Child class
public class Student:People
{
private int id;
public Student()
{
}
public Student (int id, string name)
{
this.id = id;
this.Name = name;
}
public int ID
{
get
{
return this.id;
}
set
{
this.id = value;
}
}
}
当我创建像下面那样的Student类的实例时,我无法从父类People访问NAME属性。
public partial class Form1 : Form
{
private void button1_Click(object sender, EventArgs e)
{
Student student1 = new Student();
student1. // only ID property is accessible
}
}
我做错了吗?由于学生是People的儿童班,我希望通过学生实例可以访问NAME属性。非常感谢您提前获得帮助。
答案 0 :(得分:4)
你没有做错任何事,但如果你想访问
Name
通过
的实例Student
您必须声明该属性public
。否则,只允许从该类中进行访问(不是通过实例)。
答案 1 :(得分:2)
您仍然在课外访问它,因此需要公开。
您可以在此处阅读有关访问修饰符的信息:
http://msdn.microsoft.com/en-us/library/wxh6fsc7.aspx
将您的属性更改为:
public string Name {get;set;}
你应该好好去。
答案 2 :(得分:1)
Student类不会将Name
属性暴露给外部。
如果您要从学生派生课程,则可以访问Name
属性。
或者,您可以使用Name
关键字重新实现new
,如下所示:
public class Student : People
{
private int id;
public new String Name { get; set;}
public Student()
{
}
public Student(int id, string name)
{
this.id = id;
this.Name = name;
}
public int ID
{
get
{
return this.id;
}
set
{
this.id = value;
}
}
}
答案 3 :(得分:1)
你应该制作Properties public
//My Base class
public class People
{
public People()
{
}
protected string name;
public string Name
{
get
{
return this.name;
}
set
{
this.name = value;
}
}
}
答案 4 :(得分:0)
您无法使用派生类的实例访问基类的protected
属性。
受保护的属性,如果属性只能在派生类型的边界内访问。
如果您需要从Student
的实例访问该属性,请将其声明为其基类中的公共:People
。
如果您还需要以某种方式覆盖其行为,可以在基类中声明它public virtual
并在Student
中覆盖它
答案 5 :(得分:0)
我相信你的问题是你的受保护字段在基类中而不是继承类。看看这个:http://msdn.microsoft.com/en-us/library/bcd5672a.aspx
public class BaseClass
{
public string foo
}
public class SubClass
{
protected string bar
}
这是受保护的更常见用途。