Я борюсь с взаимодействием между классами и интерфейсами, которые они реализуют. В частности, как объявить переменную типа Interface, а затем присвоить переменной объект класса, который реализует интерфейс, когда конструктору класса требуются параметры. Я реализую это на основе спецификации, поэтому я не могу просто добавить конструктор, который не требует параметров.
У меня есть конструктор, который требует 2 параметра, и методы получения:
public class exampleImpl implements example{
private int var1;
private int var2;
public exampleImpl(int var1, int var2) {
if(var2< 0) {
var1 = 1;
var2 = 1;
}
public int getVar1(){
return Var1;
}
public int getVar2(){
return Var2;
}
Затем у меня есть метод "манипулировать", который должен принять интерфейс как введите и верните его как вывод:
public example manipulate(example e) {
example eInst = (exampleImpl)e;
int newVar1 = (this.getVar1()*eInst.getVar2() + this.getVar2()*eInst.getVar1());
int newVar2 = this.getVar2()*eInst.getVar2();
Pair<Integer, Integer> pair = normaliseExample(newVar1, newVar2);
int normalisedNewVar1 = pair.getKey();
int normalisedNewVar2 = pair.getValue();
example summedE = new exampleImpl(normalisedNewVar1, normalisedNewVar2);
return summedE;
}
Интерфейс сам определяет этот метод только как:
public interface example extends Example {
public example manipulate(example e);
}
Является ли мой метод допустимым с точки зрения объявления переменной примера интерфейса, а затем присвоение переменной объекта exampleImpl, который реализует пример? Он также должен возвращать переменную типа example, но я не знаю, где newVar1 и newVar2 go, когда это происходит, поскольку они не определены в интерфейсе.
Мне также нужно протестировать этот метод с помощью JUnit 4 и я в полном недоумении, как это сделать, учитывая, что вы не можете создать экземпляр объекта типа example, так как я могу передать параметры, например:
class exampleImplTest {
@Test
public exampleImpl testManipulate()
{
assertEquals(example,exampleImpl.manipulate(example(3,4)));
}
Это показывает ошибку, потому что манипулирование не является метод stati c, но как я могу сделать его методом stati c, когда для работы требуется объект (this)? Могу ли я создать объект в классе теста для вызова этого теста? Я хочу проверить, что он возвращает правильные манипуляции, основанные на объекте "this" и новом объекте "e". Есть ли способ сделать это?
Извинения, если этот вопрос вызван непониманием, я полный новичок. Мне очень трудно понять, как можно использовать интерфейсы, поскольку спецификация требует, чтобы я использовал их здесь. Любая помощь будет принята с благодарностью.