在另一个类中使用一个类的对象

本文关键字:一个 对象 另一个 | 更新日期: 2023-09-27 18:20:47

我有两个类TeacherStudent。我试图让老师在学生身上运用课堂功能。我遇到的问题是,我需要Teacher中使用的学生对象的数量是随机的。我以为我已经在构造函数中解决了这个问题,但我必须在我使用student的每个教师函数中声明新的student对象。所以这只是创造了一个新的学生对象,对我没有好处。这是我的代码

class Teacher
{
    private bool absence;
    private bool level;
    private static int uniqueID = 0;
    private ArrayList arrayList = new ArrayList();
    private ArrayList arrayList1 = new ArrayList();
    private int id = 0;
    private int numPages;
    private char present;
    Random random = new Random();
    int randomLevel = random.Next(20, 30);//this line does not work, if I could then I would just use randomLevel in the in the line below for creating my student objects
    Student student = new Student();
    int maybe;
    public Teacher()
    {
        int randomLevel = random.Next(1, 3);
        id = uniqueID;
        absence = false;
        level = (randomLevel % 2 == 0);
        uniqueID++;
        randomLevel = random.Next(20, 30);
        Student[] student = new Student[randomLevel];
        maybe = randomLevel;
        for (int i = 0; i < randomLevel; i++)
        {
            student[i] = new Student();
        }
    }

这里有一个教师使用学生的函数

  public void addPages()//Come back need to add specific child
  {
        int choice = 0;
        Console.WriteLine("Enter the student ID");
        choice = int.Parse(Console.ReadLine());
        Student[] student= new Student[maybe];//If i get rid of this line then how will I choose which student object to use.  However this created a new student object and I do not want to do that
        student[choice] = new Student();
        int number = 0;
        if (student[choice].absent())
        {
            number = student[choice].excused();
        }
        else
        {
            Console.WriteLine("How many pages did the student read today? ");
            number = int.Parse(Console.ReadLine());
        }
        student[choice].add(number);           
   }

有没有一种方法可以让随机函数在构造函数上方的声明区域中工作?

在另一个类中使用一个类的对象

我认为您的问题归结为变量范围,但您提供了相当多的无关代码。我会简化为我认为你真正关心的事情。

class Teacher
{
    // class-level list of students
    private List<Student> _students = new List<Student>();
    public Teacher()
    {
        var random = new Random();
        var studentCount = random.Next(20,30);
        for(int i = 0; i < studentCount; i++)
        {
            _students.Add(new Student());
        }
    }
    // use _students from here on out
    public void AddPages(...) { ... }
}

不能使用构造函数或方法之外的函数调用来初始化字段。此外,您还应该将在构造函数中创建的学生数组提升为类的字段。这样,您就可以在addPages方法中访问学生数组。

有没有一种方法可以让随机函数在构造函数上方的声明区域中工作?

没有。您必须在构造函数本身中进行该调用。

您的代码还有许多其他问题,这些问题看起来很混乱。很难提出最好的方法,因为你还没有详细列出你的需求。

代码中最明显的混乱迹象之一是,每个方法都声明了一个隐藏字段student:的局部变量

Student[] student = new Student[randomLevel];

Student[] student = new Student[maybe];

另一个令人困惑的迹象是,当地人与该领域的人不属于同一类型。局部是Student[]类型的数组,而隐藏字段只是一个学生:

Student student = new Student();

这是一个很好的例子,说明了为什么对数组和集合使用复数名称是个好主意。如果用名称book而不是books来调用库的内容,则会令人困惑。这也是一个很好的例子,说明了字段有一个独特的命名约定的价值,比如使用下划线前缀的常见方法(尽管有些人不同意这种做法)。这使得在你的思维中很容易将字段和局部变量分开。

由于您希望教师对象有一个要操作的学生对象集合,并且希望该集合在方法调用中持久存在,因此该集合应该是Teacher类的一个字段,正如Austin Salonen所建议的那样。(总的来说,正如Austin所暗示的,大多数人更喜欢通用的List<>而不是数组,原因有几个。我暂时不提这个问题,因为你使用数组可能是出于教学原因。)

当你选择一名学生进行特定操作时,你可以通过索引选择该学生:

int index = GetIndexFromUserOrWhereverElse();
Student student = _students[index];
DoSomethingWith(student);

如果你想对每个学生做同样的事情,你可以使用for循环或foreach循环:

for (int index = 0; index < students.Length; index++)
    DoSomethingTo(_students[index]);

foreach(Student student in _students)
    DoSomethingTo(student);

另一个建议:为变量和方法使用描述性名称:

  • 名称number不是描述性的
  • 目前尚不清楚excused()方法返回整数的原因
  • 目前还不清楚add()对学生来说是一个整数意味着什么,特别是因为如果你加上缺席学生的数字,这个值来自excused()方法,否则它代表用户输入的页数