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

时间:2015-07-03 05:37:58

标签: c# asp.net entity-framework datatable

我有三节课;一个基类和两个子类。

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

4 个答案:

答案 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则会失败。

所以,是的,子类将拥有父类的所有属性/字段。子类可以具有比父类更多的属性/字段。父类永远不会获得子类的属性/字段。

请记住,当创建一个类时,它会获取所有属性/字段,并且它们永远不会更改。该类可以转换为父类型,然后只有显示才能拥有父类型属性/字段。

现在,说完所有这些后,这仅适用于protectedprivate属性/字段。如果字段为internalprivate,则您不会获得该行为。 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集合中,您同时拥有ContractEmployeePermanentEmployeee类型的列表,这些类型派生自Employee类。 这将由于明确的转换而起作用。

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

HoursWorked
HourlyPay

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

AnuualSalary

哪个会在运行时解决。

答案 3 :(得分:-2)

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

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

  1. 不是不是这样。基类不包含子类的数据成员