2012-09-17 31 views
11

私は、継承と多相を使ってモック従業員データベースを作成しています。スーパークラスメソッドをオーバーライドしようとすると、次のエラーが発生します。ここでメソッドは、スーパータイプからメソッドをオーバーライドしたり実装したりしません。

HourlyEmployee is not abstract and does not override abstract method resetWeek() in Employee 
public class HourlyEmployee extends Employee 
^
HourlyEmployee.java:43: error: method does not override or implement a method from a supertype 
@Override 
^ 
HourlyEmployee.java:54: error: method does not override or implement a method from a supertype 
@Override 
^ 
HourlyEmployee.java:60: error: method does not override or implement a method from a supertype 
@Override 
^ 
HourlyEmployee.java:66: error: method does not override or implement a method from a supertype 
@Override 

私の従業員のスーパークラスとHourlyEmployeeサブクラスのコードはここ

public abstract class Employee 
{ 
protected String firstName; 
protected String lastName; 
protected char middleInitial; 
protected boolean fulltime; 
private char gender; 
private int employeeNum; 

public Employee (String fn, String ln, char m, char g, int empNum, boolean ft) 
{ 
    firstName = fn; 
    lastName = ln; 
    middleInitial = m; 
    gender = g; 
    employeeNum = empNum; 
    fulltime = ft; 
} 

public int getEmployeeNumber() 
{ 
    return employeeNum; 
} 

public void setEmployeeNumber(int empNum) 
{ 
    while (empNum <= 10000 && empNum >= 99999) 
    { 
     System.out.print ("Invalid input, please try again: "); 
    } 

    if (empNum >= 10000 && empNum <= 99999) 
    { 
     employeeNum = empNum; 
    } 
} 

public String getFirstName() 
{ 
    return firstName; 
} 

public String getLastName() 
{ 
    return lastName; 
} 

public char checkGender(char g) 
{ 
    if (g != 'M' || g != 'F') 
    { 
     g = 'F'; 
    } 
    return g; 
} 

public char getGender() 
{ 
    return gender; 
} 


@Override 
public boolean equals(Object e2) 
{ 
    if (this.employeeNum == ((Employee)e2).employeeNum) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

@Override 
public String toString() 
{ 
    return employeeNum + "\n" + lastName + ", " + firstName + "\n" + "Gender:" + gender + "\n" + "Status:" + fulltime + "\n"; 
} 

public abstract double caclulateWeeklyPay(); 

public abstract void annualRaise(); 

public abstract double holidayBonus(); 

public abstract void resetWeek(); 
} 

あるHourlyEmployeeサブクラスが

public class HourlyEmployee extends Employee 
{ 
private double wage; 
private double hoursWorked; 
private double additionalHours; 

public HourlyEmployee(String fn, String ln, char m, char g, int empNum, boolean ft, double w, double h, double ahours) 
{ 
    super (fn, ln, m, g, empNum, ft); 
    wage = w; 
    hoursWorked = h; 
    hoursWorked = 0.0; 
    additionalHours = ahours; 
} 

@Override 
public String toString() 
{ 
    return this.getEmployeeNumber() + "\n" + lastName + ", " + firstName + middleInitial + "\n" + "Gender: " 
    + this.getGender() + "\n" + "Status: " + fulltime + "\n" + "Wage: " + wage + "\n" + "Hours Worked: " + hoursWorked + "\n"; 
} 

    //@Override  
public double calculateWeeklyPay(double w, double h) 
{ 
    if (h > 40) 
    { 
     w = w * 2; 
    } 

    return w * h;   
} 

//@Override 
public double annualRaise(double w) 
{ 
    return (w * .05) + w; 
} 

//@Override 
public double holidayBonus(double w) 
{ 
    return w * 40; 
} 

//@Override 
public double resetWeek(double h) 
{ 
    h = 0.0; 
    return h; 
} 

public double plusHoursWorked(double h, double ahours) 
{ 
    while (h <= 0) 
    { 
     System.out.println("Invalid value entered, please try again"); 
    } 

    h += ahours; 

    return h; 
} 


} 

答えて

11

であるあなたのEmployeeクラスが実装されているいずれも4つの抽象メソッドを、持っている(いません適切に少なくとも)。次に例を示します。

double caclulateWeeklyPay(); // in Employee 
double calculateWeeklyPay(double w, double h) // in HourlyEmployee 

親クラスは、(パラメータを含んで)同じシグネチャが含まれている必要があり、そして次のようになります。

public abstract double calculateWeeklyPay(double w, double h); 

これは宿題のように見えるので、私は残しますあなたに休ませてください。

3

ただ、慎重にエラーメッセージをお読みください。

HourlyEmployeeは抽象的ではなく、従業員に

それは明らかにあなたのEmployeeクラスがabstractで、持っていることを示している抽象メソッドresetWeekを()をオーバーライドしません。抽象メソッドresetWeek()

Employeeから拡張されたクラスHourlyEmployeeは、抽象メソッドを持つことができないため、スーパークラスのすべての抽象メソッドをオーバーライドする必要があります。

その理由は、HourlyEmployeeクラスのメソッドがスーパークラスのメソッドと異なる署名を持つからです。だからあなたのEMPLOYEE抽象クラスで宣言された抽象メソッドを実装する方法は上書きされていない、とあなたのHourlyEmployee * クラスが抽象的ではありません*あなたがに必要と@Override注釈は、コンパイラ

1

によって受け付けられません。それはかなり明白です。 以下のメソッドを実装する必要があります

public abstract double caclulateWeeklyPay(); 

public abstract void annualRaise(); 

public abstract double holidayBonus(); 

public abstract void resetWeek(); 
関連する問題