Я не хочу обсуждать достоинства этого подхода, просто, если это возможно. Я считаю, что ответ "нет". Но может быть, кто-то удивит меня!
Представьте, что у вас есть класс виджетов. Он имеет метод calculateHeight(), который возвращает высоту. Высота слишком велика - этот результат в кнопках (скажем), которые слишком велики. Вы можете расширить DefaultWidget, чтобы создать свой собственный NiceWidget, и реализовать свой собственный calculateHeight(), чтобы вернуть более удобный размер.
Теперь библиотечный класс WindowDisplayFactory создает экземпляр DefaultWidget довольно сложным способом. Вы хотите, чтобы он использовал ваш NiceWidget. Метод класса factory выглядит примерно так:
public IWidget createView(Component parent) {
DefaultWidget widget = new DefaultWidget(CONSTS.BLUE, CONSTS.SIZE_STUPIDLY);
// bunch of ifs ...
SomeOtherWidget bla = new SomeOtherWidget(widget);
SomeResultWidget result = new SomeResultWidget(parent);
SomeListener listener = new SomeListener(parent, widget, flags);
// more widget creation and voodoo here
return result;
}
Это сделка. Результат имеет DefaultWidget глубоко внутри иерархии других объектов. Вопрос: как получить этот метод factory для использования моего собственного NiceWidget? Или, по крайней мере, получить там свой собственный calculateHeight(). В идеале, я бы хотел, чтобы обезьяна заплатила DefaultWidget так, чтобы его расчетHeight сделал правильную вещь...
public class MyWindowDisplayFactory {
public IWidget createView(Component parent) {
DefaultWidget.class.setMethod("calculateHeight", myCalculateHeight);
return super.createView(parent);
}
}
Что я могу сделать в Python, Ruby и т.д. Однако я придумал имя setMethod(). Остальные варианты доступны для меня:
- Копирование и вставка кода метода
createView()в мой собственный класс, который наследуется от класса factory - Жизнь с слишком большими виджетами
Класс factory не может быть изменен - он является частью API основной платформы. Я попытался отразить полученный результат, чтобы добраться до виджета, который (в конце концов) был добавлен, но это несколько слоев виджета, и где-то он привыкает к инициализации других вещей, вызывая нечетные побочные эффекты.
Любые идеи? Мое решение до сих пор заключается в задании копирования-вставки, но в том, что компьютер, который требует отслеживания изменений родительского класса factory при обновлении до более новых версий платформы, и мне было бы интересно услышать другие варианты.