为什么我无法访问派生类中的受保护属性

时间:2014-01-08 16:34:44

标签: c# polymorphism access-modifiers

我有两个班。这是我的代码:

//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属性。非常感谢您提前获得帮助。

6 个答案:

答案 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
}

这是受保护的更常见用途。