如果一个类由另外两个类继承,那么这些子类是否具有基类的字段

本文关键字:是否 子类 基类 字段 继承 一个 如果 两个 | 更新日期: 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,它会失败。

因此,是的,子类将具有父类的所有属性/字段。子类可以具有比父类更多的属性/字段。父类从不获取子类的属性/字段。

只要记住,当一个类被创建时,它会得到它的所有属性/字段,它们永远不会改变。类可以强制转换为父类型,然后只有出现才能具有父类型属性/字段。

现在,已经说了所有这些,这只适用于publicprotected属性/字段。如果字段是privateinternal,则不会得到这种行为。private属性/字段仅在类的定义中可见,internal属性/字段只在定义类的程序集中可见。

我假设您创建的列表类似于:

var list = new List<Employee>() {
    new ContractEmployee() { ... },
    new PermanentEmployee() { ... },
};

这将起作用,因为ConvertEmployeesForDisplay中对派生类型的显式转换允许访问派生类的属性。

在您的ContractEmployee0集合中,您同时拥有从Employee类派生的类型ContractEmployeePermanentEmployeee的列表。由于显式转换,这将起作用。

如果Employee类的类型为ContractEmployee,则它将包含字段/属性

HoursWorked
HourlyPay

如果Employee类的类型为PermanentEmployee,则它将包含字段/属性

AnuualSalary

将在运行时解决。

1-在这个代码中使用了员工的多态行为。https://msdn.microsoft.com/en-us/library/ms173152.aspx

对象雇员可以是PermanentEmployee或ContractEmployees这两种类型中的任何一种。

  1. 不,事实并非如此。基类不包含子类的数据成员