创建包含类的列表的类的列表

本文关键字:列表 创建 包含类 | 更新日期: 2023-09-27 18:12:34

我正在学习c#类,并试图创建一个程序,该程序有一个名为Employee的类和ProductionWorker, ShiftSupervisor和TeamLeader的派生类。

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

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

我想能够有雇员基类有或包含某种类型的列表它的派生类和它们的对象。

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

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

我不知道这样做是否可能或现实,但从我读到的东西来看,似乎有一种方法,我只是不确定如何实现它。我愿意接受更好的建议,但是,如果有人知道一个更好的或适当的方法来获得所有的雇员列表到一个ListBox中,而不必循环通过3个不同的派生类的不同列表。

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

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; }
}

我没有意识到,直到我张贴我的类在这里,团队领导实际上是一个衍生类的生产工人。

创建包含类的列表的类的列表

可以,您可以将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;
}

如果你事先知道一个项目的类型,你可以直接cast

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