我正在学习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; }
}
直到我在这里发布我的课程,团队负责人实际上是生产工人的派生类,我才意识到。我不确定这会改变一些事情......
答案 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;