在抽象类

时间:2015-09-19 21:34:30

标签: java object abstract

我正在为学校开展工资单计划,并有一个Payroll驱动程序,Employee类,Hourly类(扩展Employee),Salaried类(扩展Employee)和SalariedPlusCommission类(延伸Salaried)。下面的代码是Employee对象和Employee中的load()方法(每个子类中也是load()方法)。我必须有一个抽象方法getEarnings(),所以整个Employee类都是抽象的。我收到的错误是"员工是抽象的;无法实例化#34;。我理解为什么我会收到错误,但我不知道如何将信息输入我的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);
        }

如果它有帮助,那么是每小时对象和来自每小时的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);
}

2 个答案:

答案 0 :(得分:0)

只要向类中添加抽象方法,就不能再实例化它。在您的方案中,如果它们为getEarnings()和Employee声明的任何其他抽象方法提供实现,则可以实例化Hourly,Salaried和SalariedPlusCommission。

像这样的类层次结构的一个共同意图是使用Employee来保存所有子类共有的行为(代码)。你扩展它并且永远不会直接实例化它。

如果确实需要实例化Employee,那么必须提供getEarnings()的实现,并且可能还要覆盖每个子类中的实现。如果您愿意,基本实现可以返回null或甚至抛出异常。有一个NOOP基础实现让我觉得潜在的“坏代码味道”,但我不知道你还想要完成什么。

您也可以使用该方法创建一个IEarn接口,并让每个子类实现它(但不是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作为一个抽象类很有用,而且从不直接实例化。

答案 1 :(得分:0)

Employee是一个抽象类,这意味着它没有实现它的所有方法。由子行来实现具有适当行为的那些方法。因此,加载Employee没有意义,而加载Hourly确实有意义,因为它实现了所有方法。

您不应该尝试实例化员工。相反,请从load()类中删除Employee方法,并仅保留HourlySalariedSalariedPlusCommission load()方法。

如果您需要为load()创建Employee方法,请询问用户他/她想要的员工类型:

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的代码,因为只有该代码可以知道它想要支持哪些员工子类型。