需要帮助上课吗?可能很简单

Posted

技术标签:

【中文标题】需要帮助上课吗?可能很简单【英文标题】:Need assistance with a class?Might be simple 【发布时间】:2010-08-01 16:40:25 【问题描述】:

我想要做的是让 UserID 根据类的类型生成随机值,因为 userID 应该从 person.cs 生成。 例如,学生类生成一个学生 id 和一个随机数,员工类应该生成一个员工 id 和一个随机数,我遇到的问题是让任何用户 ID 样本数据完全显示在控制台输出中,我没有任何数据显示用户 ID 任何人都可以帮助我。

这是查看代码所需的链接

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

【问题讨论】:

“显示”数据的代码在哪里? (我假设您的意思是打印到控制台?) 您的意思是构建一个工作人员来代替学生吗?你显示 Staff.cs。 如果要显示数据,请将其打印到控制台。 你能告诉我们你在哪里显示数据的代码吗? 抱歉停电了,这就是我想弄清楚我该怎么做? 【参考方案1】:

您的用户 ID 为空。

在 Staff 类可以给 UserID 赋值之前,基类尝试打印用户 ID

您的问题位于您编写“创建用户 ID”的人员类中

如果您不熟悉这里的继承过程是您错过的关键步骤:

1:如果你从它的子类调用父类的构造函数,所有的父类都会在子类之前运行。

如您所见,用户ID 将为空,如果您将"create userID" 替换为userID = "1000";,您应该会显示一些内容。

在我看来,你只需要改变你的算法,希望是一个简单的改变。

【讨论】:

【参考方案2】:

好的,这是关于构造函数顺序的问题。

基类构造函数总是首先被调用。您可以以某种方式看到,在派生类的语法中,对基 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
     

顺便说一句,使用随机数作为 ID 是有问题的。使用(静态计数器)生成 0,1,2,3,您发生碰撞的机会为零。不管前缀是什么。

【讨论】:

【参考方案3】:

在我看来,您的问题是首先调用来自 Person 类的构造函数,然后调用来自 Student(派生类)的构造函数。请参阅另一篇关于 base keyword 的帖子。

所以当您调用“Console.WriteLine(userID);”时在 Person 构造函数中,尚未分配任何用户 ID。

尝试添加“Console.WriteLine(userID);”到 Student 类中的构造函数。这应该适用于“新学生”调用。

从您所显示的内容来看,在 Person 类中没有分配 userID(除非在“//create userID”之后有一些您没有向我们展示的内容),因此调用“new Person”不会返回任何 userID,因为它是一个空字符串。

顺便说一句。 Person 构造函数“this.DisplayInfo();”中的最后一条语句没有理由,因为你没有在任何地方写它(你必须在 DisplayInfo 中使用 Console.WriteLine,或者使用 "Console.WriteLine( this.DisplayInfo() );" 如上一行。

贴出完整代码的链接,方便大家试用。

【讨论】:

以上是关于需要帮助上课吗?可能很简单的主要内容,如果未能解决你的问题,请参考以下文章

带有 C++ 的 WPF,有可能吗?

为啥大学老师教编程上课都不敲代码?

Python里面语句结束是用冒号吗?

编程新手如何提高编程能力

FFT 会帮助我匹配两个图像吗?

第一天上课有感