@Zolg

Как элегантнее переопределить реализацию одного из методов интерфейса для отдельно взятого объекта?

Есть некий интерфейс
interface IIfaceClass {
    int firstMethodFromInterface();

    int secondMethodFromInterface();

    /*
    .....
     */
    int nthMethodFromInterface();
}


Есть переменная IIfaceClass icObj; содержащая экземпляр какого-то (естественно - заранее неизвестно какого) класса, реализующего этот интерфейс. Нужно переопределить реализацию firstMethodFromInterface для данного конкретного экземпляра/его копии.

Есть ли способ более элегантный чем сделать обертку вроде
class HookClass implements IIfaceClass {

    final private IIfaceClass originalObject;

    public HookClass(IIfaceClass originalObject) {
        this.originalObject = originalObject;
    }

    @Override
    public int firstMethodFromInterface() {
        // изменяем логику работы
        return 100 + originalObject.firstMethodFromInterface();
    }

    @Override
    public int secondMethodFromInterface() {
        // остальные методы вызываем as-is
        return originalObject.secondMethodFromInterface();
    }

    /*
    .....
     */
    @Override
    public int nthMethodFromInterface() {
        // остальные методы вызываем as-is
        return originalObject.nthMethodFromInterface();
    }
}


ну и дальше icObj = new HookClass(icObj);

?
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
Я не понимаю что такое - "элегантно" в инженерном представлении. Это - ходить в смокинге с моноклем?
В цилиндре с сигарой?

Дружище Zolg. То что ты хочешь - противоречит принципам ООП. Если ты хочешь динамически
передавать логику - то создай новый интерфейс который принимает лямбды и это и будет коробочным
решением вопроса.
Ответ написан
Комментировать
@Zolg Автор вопроса
Я не понимаю что такое - "элегантно" в инженерном представлении.
в данном конкретном случае совет softaria про динамические прокси - гораздо более элегантное решение, чем ручное ctrl-c ctrl-v кучи не требующих модификации логики работы методов.

В каком месте это противоречит принципам ООП мне непонятно, да и в целом - пофиг.

Ваше решение задачи динамической передачи логики очень хорошее и правильное и прям по букварю.
Одна проблема - задача стоит другая.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы