Описание проблемы: Я хочу, чтобы иметь возможность передавать список методов другим классам, где методы были определены только в одном классе. Если методы, некоторые из которых имеют входные параметры и типы невоичного возврата, определены в одном классе, я хочу иметь возможность передавать список некоторых из них с возможными дубликатами в качестве параметра для какого-либо другого конструктора классов.
Описание кода: Приведенный ниже код является грубым примером и может быть проигнорирован, если он отвлекает от основной цели. Другим примером, в дополнение к приведенному ниже, будет случай, когда методы являются int Add (int n1, int n2), int Subtract (int n1, int n2), Multiply и т.д., А интерфейс имеет метод, называемый int MathOperation (int n1, int n2).
Попытка решить проблему: У шаблона адаптера есть функциональность, которую я ищу, но я видел только примеры, когда методы в интерфейсе не имеют входных или выходных параметров. Примерная реализация, которую я написал только для этого вопроса, размещена ниже.
Проблема Аналогия: У вас есть веб-служба генератора случайных изображений. Есть 30 мутаций, которые могут быть применены к изображению. Клиент подключается и нажимает кнопку "сгенерировать", и случайный список некоторых из этих функций передается другому классу в веб-службе, который затем запускает эти функции с собственными данными, одновременно собирая и, возможно, повторно используя возврат значения для генерации некоторого мутированного изображения кошки. Он не может просто явно вызвать методы в другом классе, потому что этот процесс должен выполняться случайным образом во время выполнения. Вот почему я склоняюсь к идее создания случайного списка методов, которые выполняются в порядке, когда нажата кнопка "сгенерировать".
Надеюсь, я поняла.
public class SomeClass {
...
public double UseWrench(double torque, boolean clockwise) { ... }
public double UsePliers(double torque, boolean clockwise) { ... }
public double UseScrewDriver(double torque, boolean clockwise) { ... }
public boolean UseWireCutters(double torque) { ... }
interface IToolActions {
double TurnFastener(double torque, boolean clockwise);
boolean CutWire(double torque);
}
private IToolActions[] toolActions = new IToolActions[] {
new IToolActions() { public double TurnFastener(double torque, boolean clockwise) { double UseWrench(double torque, boolean clockwise); } },
new IToolActions() { public double TurnFastener(double torque, boolean clockwise) { double UsePliers(double torque, boolean clockwise); } },
new IToolActions() { public double TurnFastener(double torque, boolean clockwise) { double UseScrewDriver(double torque, boolean clockwise); } },
new IToolActions() { public boolean CutWire(double torque) { boolean UseWireCutters(double torque); } },
};
}
public class Worker<T> {
public List<? extends IToolActions> toolActions;
public Worker(List<? extends IToolActions> initialToolSet){
toolActions = initialToolActions;
}
}