【问题标题】:Creating an instance of Abstract Class in a different class在不同的类中创建抽象类的实例
【发布时间】:2017-01-05 11:35:57
【问题描述】:

我正在尝试创建一个抽象类(员工)的实例

public abstract class Employee
{
    public Employee() { }

    public static SchoolEmployeesContext ctx = new SchoolEmployeesContext();

    public int EmployeeId { get; set; }
    public string EmployeeName { get; set; }
    public string EmployeeSurname { get; set; }
    public string Address { get; set; }
    public int Grade { get; set; }
    public double Salary { get; set; }
    public DateTime DateOfCommencement { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }

    public Department DepartmentOfEmployee { get; set; }

}

现在我正在尝试从上下文中获取员工,以实现多种功能,例如编辑和删除员工。在方法中声明 Employee 为 null 允许删除 "Unassigned" 错误。但是在运行这显然给我一个“空引用异常”

在下面查找员工的方法:

 public Employee Search(int EmpId)
        {
            var Emp = from emp in ctx.Employees
                      where emp.EmployeeId == EmpId
                      select emp;

            Employee Found = null;

            foreach (Employee e in Emp)
            {
               Found.EmployeeName =  e.EmployeeName;
               Found.EmployeeSurname = e.EmployeeSurname;
               Found.Address = e.Address;
               Found.Grade = e.Grade;
               Found.Salary = e.Salary;
               Found.DateOfCommencement = e.DateOfCommencement;
               Found.Username = e.Username;
               Found.Password = e.Password;
               Found.DepartmentOfEmployee = e.DepartmentOfEmployee;
            }


            return Found;
        }

【问题讨论】:

  • 为了更全面地回答这个问题,你能解释一下为什么你需要Employee类是抽象的吗?
  • 您的代码没有意义。您正在遍历结果并将它们的属性值分配给一个不存在的值。在每次循环迭代中(如果可以的话),您将再次覆盖这些值。

标签: c# oop abstract-class nullreferenceexception


【解决方案1】:

抽象类不能被实例化。
可以继承自,继承的类型可以实例化,但不能直接实例化。

看看你的代码,这是(我认为)你想要做的:

从你的类定义中删除abstract

此外,您的 Employee 类中有一个完全未使用的静态 -

public static SchoolEmployeesContext ctx = new SchoolEmployeesContext();

所以我建议删除它。

您的Employee 课程将变为:

public class Employee
{
    public Employee() { }

    public int EmployeeId { get; set; }
    public string EmployeeName { get; set; }
    public string EmployeeSurname { get; set; }
    public string Address { get; set; }
    public int Grade { get; set; }
    public double Salary { get; set; }
    public DateTime DateOfCommencement { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }

    public Department DepartmentOfEmployee { get; set; }
}

另外,您的 Search 方法看起来有点可疑。

您正在从数据库中选择 许多 个员工,其中 EmployeeId 等于提供的 EmpId
我觉得不合适。

您可以使用 LINQs SingleOrDefault 按 ID(或 null,如果不存在)检索单个项目

所以你的 Search 方法现在看起来像

public Employee Search(int EmpId)
{
  //this will return the single employee
  var Emp = ctx.Employees.SingleOrDefault(x=> x.EmployeeId == EmpId);

  return Emp;
}

【讨论】:

  • 也许还建议完全删除行public static SchoolEmployeesContext ctx = new SchoolEmployeesContext();
  • @Alex 谢谢!!非常有帮助,解决了我的问题。
【解决方案2】:

您不能实例化抽象类。在这里您可以找到有关它们的更多信息:https://msdn.microsoft.com/en-us/library/k535acbf(v=vs.71).aspx

抽象类与接口密切相关。它们是无法实例化的类,并且通常要么部分实现,要么根本不实现。

【讨论】:

    【解决方案3】:

    不,您不能创建抽象类的实例,因为它没有完整的实现。抽象类的目的是作为子类的基础。它就像一个模板,或者一个空的或部分空的结构,你应该先扩展它并在它上面构建,然后才能使用

    【讨论】:

      【解决方案4】:

      抽象类不能被实例化。在您提供的代码中,Employee 不需要是抽象的,因此您应该从 Employee 类定义中删除 abstract 修饰符。

      正如其他人所指出的,您的 Search 方法似乎是错误的,应该更改为选择与员工 ID 匹配的员工实体,如果找到,将该实体映射到员工。像这样的:

      public Employee Search(int EmpId)
      {
          // Return the employee with the correct Id (or null if not found).
          var e = ctx.Employees.SingleOrDefault(x=> x.EmployeeId == EmpId);
          return employeeEntity == null
              ? null
              : new Employee
                {
                    EmployeeName = e.EmployeeName,
                    EmployeeSurname = e.EmployeeSurname,
                    ...
                };
          }
      }
      

      应该给你一个可行的解决方案。

      【讨论】:

      • 在撰写本文时,接受的答案从 DataContext 返回一个 Employee 实体,而不是一个 Employee 对象,鉴于原始问题,我认为这是不正确的。我在此处添加此评论作为评论,因为在撰写本文时,我没有足够的声誉来评论我自己的帖子以外的任何内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多