Пропустить атрибуты родительского класса в Java - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть два класса java:

class Employee{
  private name;
  private annualSalary;

 public Employee(String name, double annualSalary){

}
}

и

class HourlyEmployee extends Employee{

 public HourlyEmployee(String name, double annualSalary, double hourlySalary){
 super(salary, annualSalary);
this.hourly = hourlySalary;
}
}

Есть ли способ избавиться от annualSalary от унаследованного класса, понимая, что yearSalary =hourlySalary * 200?по умолчанию при создании класса HourlyEmployee.Значение yearSalary будет пустым или будет установлено на hourlySalary * 200.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Необходимость пропустить атрибуты родительского класса - это запах кода, называемый отказ от передачи по запросу .Если у почасового сотрудника нет годовой заработной платы, класс, представляющий почасового сотрудника, не должен наследовать от класса, представляющего наемного работника.

Решение состоит в извлечении частей, которые у них есть общие, в отдельный классили несколько разных классов, в зависимости от ситуации.В вашем текущем надуманном примере нет ничего общего между двумя классами, и я не вижу смысла использовать наследование для начала.

0 голосов
/ 29 ноября 2018

Ваша классовая структура неверна, потому что не все сотрудники получают годовой оклад.Избавьтесь от annualSalary от Employee и создайте два подкласса: HourlyEmployee с почасовой оплатой и SalariedEmployee с годовой зарплатой.Если необходимо, введите абстрактный метод getAnnualSalary в Employee (и сделайте Employee abstract) и реализуйте его по-разному в двух подклассах.

abstract class Employee {
    private String name;

    public Employee(String name) { ... }
    public abstract double getAnnualSalary();
}

class SalariedEmployee extends Employee {
    private double annualSalary;

    public SalariedEmployee(String name, double annualSalary) {
        super(name);
        this.annualSalary = annualSalary;
    }

    @Override
    public double getAnnualSalary() { return annualSalary; }
}

class HourlyEmployee extends Employee {
    private double hourlySalary;

    public HourlyEmployee(String name, double hourlySalary) {
        super(name);
        this.hourlySalary = hourlySalary;
    }

    @Override
    public double getAnnualSalary() { return 200 * hourlySalary; }
}

Вы также можете изучить использование интерфейсов для определенияПоведение сотрудников, а не использование базового класса.

0 голосов
/ 29 ноября 2018

Удалить annualSalary и передать hourlySalary * 200 в конструктор суперкласса.

public class HourlyEmployee extends Employee {

    private double hourlySalary;

    public HourlyEmployee(String name, double hourlySalary) {
        super(name, hourlySalary * 200);
        this.hourlySalary = hourlySalary;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...