Я не хочу обсуждать достоинства этого подхода, просто, если это возможно. Я считаю, что ответ "нет". Но может быть, кто-то удивит меня!
Представьте, что у вас есть класс виджетов. Он имеет метод 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 при обновлении до более новых версий платформы, и мне было бы интересно услышать другие варианты.