Опубликованные спецификации крайне расплывчаты. Msgstr "Этот метод выполняет некоторые операции на c1 и c2 для создания InClass и возвращает". Это вовсе не определяет ЛЮБЫЕ функциональные требования.
Следующее решение выполняет некоторые операции над c1 и c2 (это довольно бессмысленные операции, но спецификации не запрещают этим операциям быть бессмысленными). Он также создает новый экземпляр IntClass, который возвращается. И любая реализация IntClass может быть передана в качестве параметра, и метод все равно будет работать.
public static IntClass foo(IntClass c1, IntClass c2){
c1.getClass();
c2.toString();
return new IntClass{
public void action1(){}
public void action2(){}
...
public void actionM(){}
};
}
Теперь, исходя из своих предположений о том, какими могли быть требования, я представлю другое более разумное решение. Это не полностью соответствует заявленным требованиям, но я думаю, что это могло быть то, что искал интервьюер.
public class Test{
public static IntClass foo(IntClass c1, IntClass c2){
return new CompositeIntClass(c1, c2);
}
public class CompositeIntClass implements IntClass{
private IntClass c1;
private IntClass c2;
public CompositeIntClass(IntClass c1, IntClass c2){
this.c1 = c1;
this.c2 = c2;
}
public void action1(){
c1.action1();
c2.action1();
}
public void action2(){
c1.action2();
c2.action2();
}
...
public void actionM(){
c1.actionM();
c2.actionM();
}
}
}
Используя эту реализацию, вызов foo (c1, c2) формально не будет выполнять никаких операций с c1 или c2. Таким образом, он не удовлетворяет заявленным требованиям. Тем не менее, он создаст новый экземпляр IntClass, который будет сочетать поведение c1 и c2. То есть вызов action2 () для c3 вызовет action2 () для c1 и c2. Я думаю, что это могут быть те требования, которые должны были быть (только предположение).
Таким образом, в общем, это означает, что возвращаемый объект (c3) будет иметь поведение любых произвольных реализаций IntClass. Это, однако, не будет означать, что вы сможете сделать SomeArbitraryImplClass c3 = (SomeArbitraryImplClass) foo(c1, c2);
, потому что это будет нарушением всей концепции абстракции интерфейса (безусловно, ничего, что будет рекомендовано в интервью).
Решение является примером Составной паттерн .
Если вы используете обобщенные абстракции, вы должны убедиться, что они совместимы с проблемами, которые вы собираетесь решать с ними. Поскольку все методы actionI () в описанном параметре проблемы имеют возвращаемый тип void, невозможно извлечь min и max любого экземпляра PairInterface (как описано в вашем комментарии). Абстракция не позволяет этого.
Если это то, что вы хотите сделать, решение намного проще. (Это основано на предположении, что PairInterface содержит объявления int getX()
и int getY()
, что кажется разумным для PairInterface):
public class Test{
public static PairInterface mix(PairInterface c1, PairInterface c2){
int minX = Math.min(c1.getX(), c2.getX());
int maxY = Math.max(c1.getY(), c2.getY());
return new SomePairInterfaceImplementation(minX, maxY);
}
}
Наряду с этим вам также необходимо создать класс SomePairInterfaceImplementation
или использовать какой-нибудь существующий класс, который может принимать x и y в качестве параметров конструктора.
Обратите внимание, что:
1) Если PairInterface
объявляет только пустые методы, НЕВОЗМОЖНО определить максимальные или минимальные значения x для c1 и c2. Значения инкапсулированы и скрыты и недоступны.
2) Не должно иметь значения, какую реализацию PairInterface возвращает метод. Причиной наличия возвращаемого типа интерфейса является то, что любая согласованная реализация интерфейса должна работать.