Условно переопределяющие методы в java


Итак, я читаю кучу информации из файла о клиентах в классе под названием MonthlyReports. У меня также есть класс Customer и я хочу переопределить метод в нем под названием getTotalFees, и у меня есть два подкласса классов под названием StandardCustomer и PreferredCustomer, где я хочу, чтобы getTotalFees был переопределен. Одна из важных частей информации, которая считывается, является ли клиент предпочтительным или стандартным (который хранится в переменной flag, однако мой проблема в том, что я не знаю, где/как я должен решить, является ли клиент стандартным или предпочтительным.

Вот моя идея, в классе Customer у меня есть абстрактный метод getTotalFees

public double abstract getTotalFees() {
    return this.totalFees;
}

Тогда в моих стандартных и предпочтительных классах у меня есть методы, которые переопределяют его

public double getTotalFees() {
    if (flag.equals("S"){
         return this.totalFees * 5;
    } else {
         return this.totalFees;
    }
}

Я действительно просто хватаюсь за соломинку, поэтому любая помощь будет оценена.

2 2

2 ответа:

Похоже, вам нужен фабричный метод (он же "виртуальный конструктор"). Пусть полиморфизм решит эту проблему за вас. Это один из признаков объектно-ориентированного программирования:

public class StandardCustomer extends Customer {
    // There's more - you fill in the blanks
    public double getTotalFees() { return 5.0*this.totalFees; }
}

public class PreferredCustomer extends Customer {
    // There's more - you fill in the blanks
    public double getTotalFees() { return this.totalFees; }
}

public class CustomerFactory {
    public Customer create(String type) {
        if ("preferred".equals(type.toLowerCase()) {
            return new PreferredCustomer();
        } else {
            return new StandardCustomer();
        }
    }
}

Если у вас уже есть два разных класса StandardCustomer и PreferredCustomer, Вы можете иметь две разные версии метода:

//in StandardCustomer: 
@Override
public double getTotalFees() {
     return this.totalFees * 5;
}

//in PreferredCustomer: 
@Override
public double getTotalFees() {
     return this.totalFees;
}

Dynamic dispatch в Java заботится о том, чтобы правильный метод был задействован в зависимости от типа среды выполнения экземпляра.