Я сталкивался с предоставлением общих сложных операций для всех классов, реализующих интерфейс, которые явно используют операции интерфейса.
Пока не выйдет Java 8 ...
См. http://datumedge.blogspot.hu/2012/06/java-8-lambdas.html (Методы по умолчанию)
Обходной путь для этого:
public interface I
{
public Class U{
public static void complexFunction(I i, String s){
i.f();
i.g(s)
}
}
}
Тогда вы можете легко вызвать обычную функциональность (после импорта I.U)
U.complexFunction(i,"my params...");
Может быть уточнено, с более типичным кодированием:
public interface I
{
public Class U{
I me;
U(I me){
this.me = me;
}
public void complexFunction(String s){
me.f();
me.g(s)
}
}
U getUtilities();
}
class implementationOfI implements I{
U u=new U(this);
U getUtilities(){ return u; }
}
звонит тогда
I i = new implementationOfI();
i.getUtilities().complexFunction(s);
Еще один пряный трюк
- предоставляет U как абстрактный, давая возможность для локальной реализации определенных функций для U ...
- переопределение U локальным классом и локальным конструктором с использованием I.this вместо принудительной передачи параметра ...
- с использованием статического U ... однако тогда каждая операция должна получить I i в качестве параметра ...
- использование enum вместо класса, только для статических функций, без дополнительных объектов (эквивалентно первому методу)
Причина этого состоит в том, чтобы поместить операции в один модуль вместо того, чтобы использовать служебные модули, что позволяет расширять худшую дублированную реализацию.