2010-08-01 30 views
1

我需要幫助瞭解這一點,我做錯了什麼,我的書沒有給出如何處理這個問題的明確解釋,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 "); 
} 
+1

'this.rnd.Next(1000,9999).ToString();'也許? – jerone 2010-08-01 15:49:02

+0

@jerone:是的,但如果rnd是私人的話,那仍然行不通。詳情請參閱我的回答。它也是**靜態**所以rnd不能從這個 – 2010-08-01 15:59:34

回答

3

您不能創建Person對象,因爲它是抽象的。
如果您不是母語爲英語的人,或者您只是不知道抽象的含義,請抓住一本字典,看看這個字是什麼意思。
在OOP世界中,這意味着您只能實例化派生該類的類。
谷歌多態性的進一步參考。

這意味着你的代碼應該是:

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對象而不屬於特定實例。你可以刪除這個,或者如果你認爲你需要刪除靜態。也保護它。
祝你好運。

+0

感謝大家的幫助,現在我必須弄清楚如何爲班級添加一個隨機ID – 2010-08-01 16:13:15

1

在Student.cs,你來限定它'重新使用userID和其他成員th在基類中爲private,使其爲protected並且它將會運行。更多信息,請致電Access Modifiers (C# Programming Guide)

由於您正在實例化一個抽象類爲Person的對象,因此將拋出下一個異常。抽象類僅僅是被繼承的,因此如果你想創建該類的對象,刪除abstract修飾符。

4

private字段和屬性不能被子類訪問。如果你使用protected,你應該沒問題。

+0

訪問答案是正確的,爲什麼downvote?請留下評論,解釋爲什麼你低估了。 – 2010-08-01 16:02:53

0

firstNameuserID在基類中是私有的,所以子類無法訪問它們。將它們更改爲protected

0

在您的學生課程中,您嘗試訪問userID,這是Person類的一個私人成員。如果您希望能夠從派生類訪問基類成員,則需要將它們標記爲受保護的。

0

private意味着只有類本身才能訪問它,即沒有子類。因此,您的Student班級不能訪問userID

相關問題