如果一个类由另外两个类继承,那么这些子类是否具有基类的字段
本文关键字:是否 子类 基类 字段 继承 一个 如果 两个 | 更新日期: 2023-09-27 18:01:02
我有三个类;一个基础班和两个儿童班。
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对象不在EmployeeClass中时,它是如何获得PermanentEmployees的
2.是因为员工类正在获取子类的所有字段吗?
p.S:如果我不清楚(不能在这里发布EF图片需要信誉积分(,请参考这篇帖子。
您定义的类允许您创建这三种类型中的任何一种的对象。
这意味着您可以创建看起来像的类型,如下所示:
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; }
}
这意味着,当你创建这三个中的任何一个时,它们总是已经创建的类型,并且它们总是分配了这些属性(和底层字段(。它们从来都不是不同的类型,也从来没有不同的数据。
但由于CCD_ 2&PermanentEmployee
都继承自Employee
,当它们被强制转换为Employee
时,它们都可以出现为Employee
类型。
现在,您可以从ContractEmployee
的一个实例开始,将其强制转换为Employee
,它看起来像Employee
,但它仍然是ContractEmployee
。如果您尝试将其强制转换回ContractEmployee
,它会起作用,但如果您尝试强制转换为PermanentEmployee
,它会失败。
因此,是的,子类将具有父类的所有属性/字段。子类可以具有比父类更多的属性/字段。父类从不获取子类的属性/字段。
只要记住,当一个类被创建时,它会得到它的所有属性/字段,它们永远不会改变。类可以强制转换为父类型,然后只有出现才能具有父类型属性/字段。
现在,已经说了所有这些,这只适用于public
和protected
属性/字段。如果字段是private
或internal
,则不会得到这种行为。private
属性/字段仅在类的定义中可见,internal
属性/字段只在定义类的程序集中可见。
我假设您创建的列表类似于:
var list = new List<Employee>() {
new ContractEmployee() { ... },
new PermanentEmployee() { ... },
};
这将起作用,因为ConvertEmployeesForDisplay
中对派生类型的显式转换允许访问派生类的属性。
在您的ContractEmployee
0集合中,您同时拥有从Employee
类派生的类型ContractEmployee
和PermanentEmployeee
的列表。由于显式转换,这将起作用。
如果Employee
类的类型为ContractEmployee
,则它将包含字段/属性
HoursWorked
HourlyPay
如果Employee
类的类型为PermanentEmployee
,则它将包含字段/属性
AnuualSalary
将在运行时解决。
1-在这个代码中使用了员工的多态行为。https://msdn.microsoft.com/en-us/library/ms173152.aspx
对象雇员可以是PermanentEmployee或ContractEmployees这两种类型中的任何一种。
- 不,事实并非如此。基类不包含子类的数据成员