2010-08-01 4 views
2

То, что я пытаюсь сделать, - это получить идентификатор пользователя для генерации случайных значений в зависимости от типа класса, который должен быть создан userID от person.cs. Например, класс ученика генерирует идентификатор студента и случайное число, с которым класс персонала должен генерировать идентификатор персонала и случайное число, проблема, с которой я сталкиваюсь, заключается в том, что все образцы данных пользовательского идентификатора отображаются вообще на выходе консоли, Я не получаю какие-либо данные, чтобы отображать для userID кто-нибудь может мне помочь.Нужна помощь с классом? Может быть, просто

Вот ссылки запрошен для просмотра кода

Person.cs

PersonTest.cs

Student.cs

Staff.cs

Faculty.cs

Person.cs

public class Person 
{ 
    static string title; 
    protected string firstName; 
    protected string lastName; 
    protected string address; 
    protected string gender; 
    protected string dateOfBirth; 
    protected string userID; 
    protected 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; 
     Console.WriteLine(this.DisplayInfo()); 

     //create userID 


     Console.WriteLine(userID); 

     this.DisplayInfo(); 
    }//end 6-parameter constructor 

Просто Добавлено

public string DisplayInfo() 
    { 
     return " You have created the person " + firstName + lastName +"\n whose address is" + address + "\n" + " whos is a " + gender + " and was born on " + dateOfBirth; 
    }//end method DisplayInfo 

Staff.cs student.cs имеет одни и те же данные теперь

public class Staff : Person 
    { 
     public Staff(string aTitle, string aFirstName, string aLastName, string aAddress, 
      string aGender, string aDateOfBirth) 
      : base(aTitle, aFirstName, aLastName, aAddress, 
        aGender, aDateOfBirth) 
     { 

      this.userID = firstName.Substring(0, 1) + lastName.Substring(0, 5); 

      this.userID = this.userID + this.rnd.Next(1000, 9999); 


     } 

PersonTest.cs

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


      Person studentPerson = new Person("Mr.", "Jerry ", "Panes", " 493 Bluebane RD", "Male", " 8-06-1953 "); 

      // THIS DATA SHOWS UP BUT NOT THE USERID 



      Console.ReadLine(); 
     }//end main 

UML Diagram http://img529.imageshack.us/img529/5936/capturemv.jpg

+0

Где код, который «отображает» данные? (Предполагаю, вы имеете в виду печать на консоль?) –

+1

Вы имели ввиду построить Staff in lieu of Студент? Вы показываете Staff.cs. – Rob

+0

Скорее добавьте данные извините –

ответ

1

ОК, это, оказывается, вопрос о последовательности конструкторов.

Конструкторы (ы) базового класса всегда называются первыми. Вы можете как-то увидеть, что в синтаксисе производного класса вызов базового ctor происходит между списком параметров и производным телом.

мы имеем:

public class Person(....) 
{ 
    protected string userID; 

    public Person(....) 
    { 
     //create userID //no, print it 
     Console.WriteLine(userID); 
    } 
} 

public class Staff : Person 
{ 
    public Staff(...) 
     : base(....)   // now it is printed 
    { 
     this.userID = ...; // and now it is filled 
    } 
} 

Btw, используя случайное число для ID сомнительна. Используйте (статический окунь) для генерации 0,1,2,3, и у вас есть нулевой шанс столкновения. Независимо от префикса.

2

Ваш идентификатор пользователя равен нулю.

Базовый класс пытается напечатать идентификатор пользователя перед классом персонала может дать значение USERID

Ваша проблема находится в человеке классе, где вы написали «Создать идентификатор_пользователя»

Если не знакомы с как процесс идет для наследования здесь - это ключевой шаг, который вы пропустили:

1: Если вы вызываете конструктор родительского класса из его дочернего класса, ВСЕ родительский класс запускается перед дочерним элементом.

Как вы видите, идентификатор пользователя будет пустым, если вы замените "create userID" на userID = "1000";, у вас должно получиться что-то отображаемое.

С моей точки зрения, вам просто нужно изменить свой алгоритм, простое изменение, надеюсь.

0

На мой взгляд, ваша проблема заключается в том, что сначала вызывается конструктор класса Person, а затем вызывается конструктор из Student (производный класс). Посмотреть еще сообщение о base keyword.

Итак, когда вы вызываете «Console.WriteLine (userID)»; в конструкторе Person ни один пользовательский идентификатор еще не назначен.

Попробуйте добавить «Console.WriteLine (userID)»; конструктору класса Student. Это должно работать для вызова «нового ученика».

Из того, что вы показали, нет никакого атрибута userID в классе Person (если нет «после создания» // создания userID), поэтому вызов «new Person» не будет возвращать идентификатор пользователя , потому что это пустая строка.

КПП. последнее выражение в конструкторе Person "this.DisplayInfo();" не имеет причин, потому что вы нигде не пишете его (вам нужно будет использовать Console.WriteLine в DisplayInfo или использовать «Console.WriteLine (this.DisplayInfo())», как в приведенной выше строке.

Опубликовать ссылка на полный код, так что мы можем попробовать его.

+0

Добавил ссылки, которые вы просили, спасибо за помощь. –

Смежные вопросы