由于其保护级别无法访问?请帮帮我

时间:2010-08-01 15:46:00

标签: c#

我需要帮助解决这个问题,我做错了什么我的书没有给出如何处理这个问题的明确解释,VS2008中的在线帮助也没有。 你能告诉我如何正确地做到这一点吗?

我得到的另一个错误:

  

无法创建的实例   抽象类或接口   “Person.Person”

     

会员Person.Person.rnd'不可能   使用实例引用访问;   使用类型名称来限定它

Person.cs

  public abstract class Person
  {
        private string title;
        private string firstName;
        private string lastName;
        private string address;
        private string gender;
        private string dateOfBirth;
        private string userID;
        static Random rnd = new Random();
        // constructors
        public Person()
        {

        }//end default constructor

        public Person(string aTitle, string aFirstName, string aLastName,
                      string aAddress, string aGender, string aDateOfBirth)
        {
            title = aTitle;
            firstName = aFirstName;
            lastName = aLastName;
            address = aAddress;
            gender = aGender;
            dateOfBirth = aDateOfBirth;
        }
  }

Student.cs

 public class Student: Person
 {
        public override string GenerateUserID()
        {
            this.userID = firstName.Substring(0, 1) + lastName.Substring(0, 5);
            //ERROR HAPPENS HERE
            this.userID = this.userID + this.rnd.Next(1000, 9999);
        }//end method Generate UserID
 }   

PersonTest.cs

static void Main(string[] args)
{
    //ERROR HAPPENS HERE TOO Cannot Create an instance of the abstract class or interface "Person.Person"
    Person testPerson = new Person("Mr.", "Merry ", "Lanes", 
                                   " 493 Bluebane RD", "Male", " 8-06-1953 ");
}

6 个答案:

答案 0 :(得分:4)

子类无法访问

private个字段和属性。如果你使用protected,你应该没问题。

答案 1 :(得分:3)

你不能创建一个Person对象,因为它是抽象的 如果您不是母语为英语的人,或者您只是不知道抽象的含义,请抓住字典,看看这个词的含义。
在OOP世界中,这意味着您只能实现派生该类的类 进一步参考google polymorphism。

这意味着您的代码应为:

static void Main(string[] args) 
{ 
   Person testPerson = new Student("Mr.", "Merry ", "Lanes", " 493 Bluebane RD", "Male", " 8-06-1953 ");
}

您还应该更改您的学生构造函数以接受这些参数并将它们移动到基类,如下所示:

public Student(string aTitle, string aFirstName, string aLastName, string aAddress,    
        string aGender, string aDateOfBirth)
: base(aTitle, aFirstName, aLastName, aAddress,    
        aGender, aDateOfBirth)
{
}

正如其他人所提到的,如果要从派生类访问基类的成员变量,请使用protected protected表示这对我的派生类是公开的,对其他任何人都是私有的。 此外,您的rnd变量是静态和私有的 这意味着您无法从this访问它,因为它属于所有Person对象而不属于特定实例。您可以删除此项,或者如果您认为需要,请删除静态。也要保护它。
祝你好运。

答案 2 :(得分:1)

在Student.cs中,您正在使用userID和基类中private的其他成员,使其成为protected并且它将正在运行。更多信息,Access Modifiers (C# Programming Guide)

抛出下一个异常,因为您正在实例化一个抽象类Person的对象。抽象类只是要继承,因此如果您希望创建该类的对象,请删除abstract修饰符。

答案 3 :(得分:0)

firstNameuserID在基类中是私有的,因此子类无法访问它们。将它们更改为protected

答案 4 :(得分:0)

在您的Student课程中,您尝试访问的是userID,它是Person类的私有成员。如果您希望能够从派生类访问基类成员,则需要将它们标记为受保护。

答案 5 :(得分:0)

private表示只有类本身才能访问它,即没有子类。因此,您的Student课程无法访问userID