我正在研究 C# 类并尝试创建一个程序,该程序具有名为 Employee 的类和 ProductionWorker、ShiftSupervisor 和 TeamLeader 的派生类。
我有一个列表框,我想在其中显示所有员工,在程序中,有添加、编辑或删除相应人员的功能,而不是像这样制作 3 个列表:
List<ProductionWorkers> pWorkers = new List<ProductionWorkers>();
List<ShiftSupervisor> sSupervisors = new List<ShiftSupervisor>();
List<TeamLeader> tLeaders = new List<TeamLeader>();
我希望能够让 Employee 基类拥有或包含它的派生类及其对象的某种列表。
例如,我希望能够以某种方式向员工列表添加和删除派生对象,给出以下示例:
List<Employee> employees = new List<Employee>();
ProductionWorker _pWorker = new ProductionWorker();
_pWorker.Name = "Bob";
_pWorker.EmployeeID = 1234;
employees.Add(_pWorker));
我不知道这样做是否可能或现实,但从我读到的内容来看,似乎有一种方法,我只是不确定如何实现它。但是,如果有人知道更好或更正确的方法来将所有员工列在列表框中,而不必循环遍历不同派生类的 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; }
}
直到我在这里发布了我的类(class),我才意识到 Team Leader 实际上是 Production Worker 的派生类。我不确定这是否会改变...
最佳答案
是的,您可以将 Employee
项和从 Employee
派生的项添加到 employee
列表中。
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;
关于c# - 创建包含类列表的类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32531656/