Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在抽象类中返回对象的解决方法_Java_Object_Abstract - Fatal编程技术网

Java 在抽象类中返回对象的解决方法

Java 在抽象类中返回对象的解决方法,java,object,abstract,Java,Object,Abstract,我正在为学校做一个工资单项目,有一个工资单驱动程序、员工班、小时班(扩展员工)、带薪班(扩展员工)和带薪佣金班(扩展带薪)。下面的代码是Employee对象和Employee的load()方法(在每个子类中也是load()方法)。我必须有一个抽象方法getEarnings(),这样整个Employee类都是抽象的。我得到一个错误,上面写着“雇员是抽象的,不能实例化”。我理解为什么会出现错误,但我不知道如何将信息输入到我的Employee对象中 public Employee(String

我正在为学校做一个工资单项目,有一个工资单驱动程序、员工班、小时班(扩展员工)、
带薪
班(扩展员工)和
带薪佣金
班(扩展带薪)。下面的代码是Employee对象和Employee的
load()
方法(在每个子类中也是
load()
方法)。我必须有一个抽象方法
getEarnings()
,这样整个Employee类都是抽象的。我得到一个错误,上面写着“雇员是抽象的,不能实例化”。我理解为什么会出现错误,但我不知道如何将信息输入到我的Employee对象中

    public Employee(String name, String socialSecurityNumber, int month, int week)
        {
            this.name=name;
            this.socialSecurityNumber=socialSecurityNumber;
            this.month=month;
            this.week=week;              
        }

        public static Employee load()
        {
            Scanner stdIn = new Scanner (System.in);
            System.out.println("Name ==> ");
            name=stdIn.nextLine();
            System.out.println("Social Security Number ==>");
            socialSecurityNumber=stdIn.nextLine();
            System.out.println("Birthday Month '('1-12')' ==> ");
            month=stdIn.nextInt();
            System.out.println("Birthday Bonus Week '('1-4')' ==>");
            week=stdIn.nextInt();
            return new Employee(name, socialSecurityNumber, month, week);
        }
如果有帮助,这里是Hourly对象和Hourly的
load()
方法:

public Hourly(String name, String socialSecurityNumber, int month, int week, double hourlyPay, double hoursWorked)
{
    super(name, socialSecurityNumber, month, week);
    this.hourlyPay=hourlyPay;
    this.hoursWorked=hoursWorked;  
}

public static Hourly load()
{
    Scanner stdIn = new Scanner (System.in);
    System.out.println("Hourly Pay ==> ");
    hourlyPay=stdIn.nextDouble();
    System.out.println("Hours Worked This Past Week ==>");
    hoursWorked=stdIn.nextDouble();
    return new Hourly(name, socialSecurityNumber, month, week, hourlyPay, hoursWorked);
}

一旦将抽象方法添加到类中,就不能再实例化它。在您的方案中,您可以实例化Hourly、Salaried和SalariedPlusCommission,前提是它们提供了getEarnings()和Employee声明的任何其他抽象方法的实现

这样的类层次结构的一个共同目的是使用Employee来保存所有子类的公共行为(代码)。您可以扩展它,而从不直接实例化它

如果确实需要实例化Employee,那么必须提供getEarnings()的实现,并且可能还要覆盖每个子类中的实现。如果愿意,基本实现可以返回null,甚至抛出异常。拥有一个基于NOOP的实现对我来说是一种潜在的“糟糕的代码味道”,但我不知道您还想实现什么

您还可以使用该方法创建一个iLean接口,并让每个子类实现它(但不包括Employee)。这里的问题是,您将无法将所有实体声明为基类,以便在收益方面对它们进行多态处理。您将无法执行以下操作:

Employee foo = new Hourly();
Employee baz = new Salaried();
baz.getEarnings();
foo.getEarnings();
您必须执行以下操作:

IEarn foo = new Hourly();
IEarn baz = new Salaried();
baz.getEarnings();
foo.getEarnings();

但是这里要做的典型事情是设计类层次结构,这样Employee就可以作为一个抽象类使用,而不会直接实例化。

Employee
是一个抽象类,这意味着它不会实现它的所有方法。由子类以适当的行为实现这些方法。因此,加载
员工
是没有意义的,而加载
每小时
是有意义的,因为它实现了所有方法

您不应该尝试实例化员工。相反,从
Employee
类中删除
load()
方法,只保留
Hourly
Salaried
SalariedPlusCommission
load()方法

如果需要为
Employee
创建
load()
方法,请询问用户需要什么样的员工:

System.out.println("Type (Hourly, Salaried or SalariedPlusCommission): ");
t=stdIn.nextLine();
switch(t) {
   case "Hourly":
       return Hourly.load()
       break;
    // other cases
}

但是,请注意,这不是一个好的实践,
Employee
类不应该负责实例化其子类。此要求适用于使用
员工的代码。例如,不应要求
Employee
类了解其所有子类。使用
Employee
的代码就有这个责任,因为只有该代码才能知道它想要支持哪些Employee子类型。

您是否试图通过声明公共构造函数为抽象来调用它?