我有两个班级Teacher
和Student
。我想让老师在学生中使用班级功能。我遇到的问题是我需要Teacher
中使用的学生对象的数量是随机的。我以为我在构造函数中想出了这个,但是我必须在我使用学生的老师的每个功能中声明新的学生对象。所以这只是创造了一个对我不利的新学生对象。这是我的代码
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);
}
有没有办法让随机在构造函数上方的声明区域中工作?
答案 0 :(得分:3)
我认为你的问题归结为可变范围,但你提供了相当多的无关代码。我会简化到我认为你真正关心的事情。
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(...) { ... }
}
答案 1 :(得分:1)
您无法在构造函数或方法之外使用函数调用初始化字段。此外,您应该将在构造函数中创建的学生数组提升到类的字段。这样您就可以使用addPages
方法访问学生数组。
答案 2 :(得分:0)
有没有办法让随机在构造函数上方的声明区域中工作?
没有。你必须在构造函数本身中进行调用。
您的代码还有许多其他问题,这似乎很困惑。由于您未详细列出您的要求,因此很难建议最佳方法。
代码中最明显的混淆迹象之一是每个方法声明一个隐藏字段student
的局部变量:
Student[] student = new Student[randomLevel];
和
Student[] student = new Student[maybe];
混淆的另一个迹象是当地人与田地的类型不同。本地人是Student[]
类型的数组,而隐藏字段只是一个学生:
Student student = new Student();
这是为什么为数组和集合使用复数名称的好主意。如果您使用名称book
而不是books
调用库的内容,则会令人困惑。它也是为字段设置不同命名约定的一个很好的例子,比如使用下划线前缀的常见方法(虽然有些人不同意这种做法)。这使您可以轻松地将字段和局部变量分开。
由于您希望教师对象拥有要操作的学生对象的集合,并且您希望该集合在方法调用中保持不变,因此该集合应该是Teacher
类的字段,如Austin Salonen提示。 (一般来说,正如奥斯丁所暗示的那样,大多数人更喜欢泛型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()
方法,否则它代表一个用户输入的页数。