拍摄一个物体并将其添加到appropritae集合

时间:2015-11-10 06:51:57

标签: c# regex class inheritance

我正在做一些实验,它让我创建了多个继承自基类的类。我创建了基类,一个继承自基类的学生类,它创建了一个继承自基类的学生和教师类,从而创建了一个教师。现在我正在创建一个不继承任何类的学校类。我完成了大部分想要我做的事情,但我仍然坚持创建适当的方法来将对象添加到适当的类中。我需要有关如何创建这些方法的帮助和指导,以便我可以继续。我刚刚发布我正在工作的学生班和说明书。我不是在寻找有人为我做功课,我似乎无法在网上找到任何可以指导我正确方向的东西。谢谢您的帮助。

  

方法

     
      
  1. 添加(基础) - 获取教师/学生对象并将其添加到   适当的收藏。

  2.   
  3. Print(base []) - 采用的私有方法   基类对象的数组并打印出的所有元素   阵列。

  4.         

    3打印(bool students = true) - 打印输出的公共方法   学生列表或基于参数值的教师列表。   这是通过使用学生[]或调用Print(base [])来完成的   老师[]基于布尔。

namespace BaseClass
{
    class School
   {
    List<Teacher> staff = new List<Teacher>();
    List<Student> students = new List<Student>();

    public Student Students
    {
        get
        {
            students.Count();
            return Students;
        }
    }
    public Teacher Staff
    {
        get
        {
            if(Staff.EnumProp == Status.Employeed)
            {
                staff.Count();
            }
            return Staff;
        }
    }
    public void Add(Teacher t1, Student s1) //not sure if this is correct or 
                                           //what to do in this method??
    {
        staff.Add(t1);
        students.Add(s1);

//i also need help in the following methods. i am not sure what needs to be put
//in the parameter of the method, based on the instructions. 

2 个答案:

答案 0 :(得分:2)

根据要求1,您必须Add(Base c)并确定要从中添加的集合。例如(c is Teacher ? staff : students).Add(c)。通常这样的类会分别重载(Add(Teacher) and Add(Student))以便能够直接添加。

public void Add(Base c) 
{
    if(c is Teacher)
        staff.Add((Teacher)c);
    else
        students.Add((Student)c);
}

2取决于输出类型。通过分配输出到控制台通常就足够了,因此您可以使用类似

的内容
void Print(params Base[] peeps)
{
    foreach(var c in peeps)
       c.Print();
}

无论Print如何实施,步骤3实际上都非常简单。您可以按照要求中的说明调用Print(Base [])。要获取该数组,您必须确定要使用的集合,就像在req中一样。 1.(听起来确实需要2个单独的集合,否则可以在Base暴露人的角色的情况下使用单个集合。)

public void Print(bool students = true)
{
    if(students)
       Print(this.students.ToArray());
    else
       Print(staff.ToArray());
}
PS,正如评论中所提到的,学生和工作人员的财产似乎暴露了一些可以改变的行为,但由于这超出了问题的范围,除非你想要我们,否则不会去那里;)

答案 1 :(得分:1)

  

添加(基础) - 获取教师/学生对象并将其添加到相应的集合中。

对于添加,您可以使用两个名称相同但签名不同的方法。它们被称为方法重载。编译器可以通过查看它们所采用的参数来区分它们。

这些方法都是在base方法中定义的。但更好的设计是将每个方法放在适当的类中。 (即老师和学生班)

public void Add(Teacher teacher)
{
    staff.Add(teacher);
}

public void Add(Student student)
{
    students.Add(student);
}
  

Print(base []) - 获取基类对象数组并打印数组所有元素的私有方法。

如果我理解正确,你想要打印学生或老师的所有元素。这就是全部吗?

在基类中,您可以使用私有方法打印数组。

private void Print(Base[] array)
{
    for (int i = 0; i < array.Length; i++)
    {
        Console.WriteLine(array[i].ToString());
    }
}

最好为Student和Teacher类重写ToString方法。例如,这两种类都需要这种方法。

public override string ToString() // write this method in both student and teacher classes.
{
    return string.Format("Name : {0} , Age : {1}",studentName,studentAge ); // return optional information of student instance.
}
  

3 Print(bool students = true) - 根据参数值打印出学生列表或教师列表的公共方法。这是通过使用学生[]或教师[]根据布尔调用Print(base [])来完成的。

你只需要一个简单的检查。

public void Print(bool students = true)
{
    if(students)
       Print(Students.ToArray());
    else
       Print(Staff.ToArray());
}

仅当其内部基类位于Print(base[])后面时才有效。否则必须保护Print(base [])。

更好的设计是分别在子类中添加每个print方法。

在你的get and set方法中,你正在做的事情真的没用。

Count()是一个linq方法,可以计算并给出列表的长度。你可以使用列表本身的属性。 Count(不带括号)直接给出列表的长度。

此外,你不会把结果存储在任何地方,所以这就是为什么我说它没用。您可能希望存储总计数。然后你可以做到这一点。

public int TotalCount
{
    get { return staff.Count + students.Count; }
}