创建包含类列表的类列表

时间:2015-09-11 20:29:09

标签: c#

我正在学习C#Classes,我正在尝试创建一个程序,该程序包含一个名为Employee的类,以及ProductionWorker,ShiftSupervisor和TeamLeader的派生类。

我有一个列表框,我想显示所有员工,在程序中,有添加,编辑或删除相应人员的功能,而不是像这样制作3个列表:

List<ProductionWorkers> pWorkers = new List<ProductionWorkers>();
List<ShiftSupervisor> sSupervisors = new List<ShiftSupervisor>();
List<TeamLeader> tLeaders = new List<TeamLeader>();

我希望能够让Employee基类拥有或包含某种派生类及其对象的列表。

例如,我希望能够以某种方式将派生对象添加和删除到Employees列表,给出以下示例:

List<Employee> employees = new List<Employee>();
ProductionWorker _pWorker = new ProductionWorker();
_pWorker.Name = "Bob";
_pWorker.EmployeeID = 1234;
employees.Add(_pWorker));

我不知道这样做是否可行或现实,但看起来似乎有一种方法可以解读,我只是不确定如何实现它。我愿意接受更好的建议,如果有人知道更好或更正确的方法将所有Employees列入ListBox而不必遍历3个不同派生类的不同列表。

为清楚起见,下面是Base类,然后是它的以下派生类。

public class Employee
{
    public string Name { get; set; }
    public int EmployeeNumber { get; set; }
}

class ProductionWorker : Employee
{
    public int ShiftNumber { get; set; }
    public decimal HourlyPayRate { get; set; }
}

class TeamLeader : ProductionWorker
{
    public int ReqHours { get; set; }
    public int AttendedHours { get; set; }
}

class ShiftSupervisor : Employee
{
    public int Salary { get; set; }
    public int AnnualProductionBonus { get; set; }
}

直到我在这里发布我的课程,团队负责人实际上是生产工人的派生类,我才意识到。我不确定这会改变一些事情......

1 个答案:

答案 0 :(得分:4)

是的,您可以将Employee项目和来自Employee的项目添加到employees列表中。

List<Employee> employees = new List<Employee>();
ProductionWorker pWorker = new ProductionWorker {
    Name = "Bob",
    EmployeeID = 1234
};
employees.Add(pWorker);

如果要在同一列表框中显示所有这些不同类型的员工,请覆盖这些类中的ToString方法。 ListBox将自动使用它以显示项目。

public class ProductionWorker : Employee
{
    public override string ToString()
    {
        return String.Format("{0} ({1}), production", Name, EmployeeID);
    }
}

您可以将员工列表分配到列表框中,如下所示

employeeListBox.DataSource = employees;

从员工列表中,您可以直接访问Employee中声明的成员:

int id = employees[i].EmployeeID;

然而;如果要访问派生类型的成员

,则需要强制转换
int salary = 0;
var supervisor = employees[i] as ShiftSupervisor;
if (supervisor != null) {
   salary = supervisor.Salary;
}

如果您事先知道某个项目的类型,则可以直接投射

int salary = ((ShiftSupervisor)employees[0]).Salary;