我有三节课;一个基类和两个子类。
public class Employee
{
[Column(Order = 1)]
public int ID { get; set; }
[Column(Order = 2)]
public string FirstName { get; set; }
[Column(Order = 3)]
public string LastName { get; set; }
[Column(Order = 4)]
public string Gender { get; set; }
}
public class ContractEmployee : Employee
{
[Column(Order = 6)]
public int HoursWorked { get; set; }
[Column(Order = 7)]
public int HourlyPay { get; set; }
}
public class PermanentEmployee : Employee
{
[Column(Order = 5)]
public int AnnualSalary { get; set; }
}
现在,如果我创建一个使用DataTable
的函数。
private DataTable ConvertEmployeesForDisplay(List<Employee> employees)
{
DataTable dt = new DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("FirstName");
dt.Columns.Add("LastName");
dt.Columns.Add("Gender");
dt.Columns.Add("AnuualSalary");
dt.Columns.Add("HourlyPay");
dt.Columns.Add("HoursWorked");
dt.Columns.Add("Type");
foreach (Employee **employee** in employees)
{
DataRow dr = dt.NewRow();
dr["ID"] = employee.ID;
dr["FirstName"] = employee.FirstName;
dr["LastName"] = employee.LastName;
dr["Gender"] = employee.Gender;
if (employee is PermanentEmployee)
{
dr["AnuualSalary"] = ((PermanentEmployee)employee).AnnualSalary;
dr["Type"] = "Permanent";
}
else
{
dr["HourlyPay"] = ((ContractEmployee)employee).HourlyPay;
dr["HoursWorked"] = ((ContractEmployee)employee).HoursWorked;
dr["Type"] = "Contract";
}
dt.Rows.Add(dr);
}
return dt;
}
我的疑惑 1.员工对象在Employee Class中不存在时如何获取PermanentEmployee? 是因为员工班正在获得所有子课程领域吗?
P.S:如果我不清楚(无法在此处发布EF图像需要声望点),请参阅this post。
答案 0 :(得分:3)
您定义的类允许您创建这三种类型中的任何一种对象。
这意味着您可以创建以下看起来像的类型:
public class Employee
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Gender { get; set; }
}
public class ContractEmployee
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Gender { get; set; }
public int HoursWorked { get; set; }
public int HourlyPay { get; set; }
}
public class PermanentEmployee
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Gender { get; set; }
public int AnnualSalary { get; set; }
}
这意味着,当您创建这三个中的任何一个时,它们始终是已创建的类型,并且它们始终分配了这些属性(和基础字段)。它们永远不是一个不同的类型,它们永远不会有不同的数据。
但是因为ContractEmployee
&amp; PermanentEmployee
Employee
都继承自Employee
,当Employee
转换为ContractEmployee
时, 可以<{1}}。
现在您可以从Employee
的实例开始,将其转换为Employee
,它看起来像ContractEmployee
,但它仍然是ContractEmployee
。如果您尝试将其强制转换回PermanentEmployee
它会起作用,但如果您尝试转换为public
则会失败。
所以,是的,子类将拥有父类的所有属性/字段。子类可以具有比父类更多的属性/字段。父类永远不会获得子类的属性/字段。
请记住,当创建一个类时,它会获取所有属性/字段,并且它们永远不会更改。该类可以转换为父类型,然后只有显示才能拥有父类型属性/字段。
现在,说完所有这些后,这仅适用于protected
和private
属性/字段。如果字段为internal
或private
,则您不会获得该行为。 internal
属性/字段仅在类的定义中可见,SELECT TOP 3 Image_Column FROM T_Banner ORDER BY Image_Column DESC
属性/字段仅在定义类的程序集中可见。
答案 1 :(得分:1)
我假设您正在创建类似的列表:
var list = new List<Employee>() {
new ContractEmployee() { ... },
new PermanentEmployee() { ... },
};
由于ConvertEmployeesForDisplay
中派生类型的显式转换,它可以正常工作,允许访问派生类的属性。
答案 2 :(得分:0)
在employee
集合中,您同时拥有ContractEmployee
和PermanentEmployeee
类型的列表,这些类型派生自Employee
类。
这将由于明确的转换而起作用。
如果Employee
类的类型为ContractEmployee
,那么它将包含字段/属性
HoursWorked
HourlyPay
如果Employee
类的类型为PermanentEmployee
,那么它将包含字段/属性
AnuualSalary
哪个会在运行时解决。
答案 3 :(得分:-2)
1 - 在此代码中使用员工的多态行为。 https://msdn.microsoft.com/en-us/library/ms173152.aspx
对象员工可以是PermanentEmployee或ContractEmployee这两种类型中的任何一种。