Доступ к закрытому полю интерфейса внутри абстрактного тестового класса - PullRequest
0 голосов
/ 24 октября 2018

У меня есть абстрактный базовый тестовый класс и интерфейс.Внутри тестового класса объявляется закрытое поле интерфейса типа.

abstract class FibonacciTest {
  *private FibonacciImplementation fibonacciImplementation;*

   public FibonacciImplementation getImplementation(){
       return this.fibonacciImplementation;
   }
   protected void setImplementation(FibonacciImplementation fibimplem){
       this.fibonacciImplementation = fibimplem;
   }
  abstract void createFibonacciImplementation();

  @BeforeEach
  void createImplementation(){
    createFibonacciImplementation();
  }

  @Test
  void invalidPosition(){
    assertEquals(new BigInteger("-2"),
      fibonacciImplementation.calculateFib(-2));
  }

Интерфейс:

public interface FibonacciImplementation {
  BigInteger calculateFib(int position);
}

Классы субтестов для базового класса тестов выглядят примерно так:

public class RecursiveFibonacciTest extends FibonacciTest{

  @BeforeEach
  void createFibonacciImplementation(){
    fibonacciImplementation = new RecursiveFibonacciImplementation();* error is here
  }
}

RecursivefibonacciImplentation заключается в следующем:

public class RecursiveFibonacciImplementation implements FibonacciImplementation {

  @Override
  public BigInteger calculateFib(int position) {

    if(position < 0 )
      return new BigInteger("" + position);
    if(position == 1 || position == 0)
      return new BigInteger("1");

    return calculateFib(position-1).add(calculateFib(position-2));
  }
}

Проблема, с которой я столкнулся, заключается в том, что когда в классе суб-теста компилятор жалуется, что я пытаюсь получить доступ к закрытому полю.Поле private FibonacciImplementation fibonacciImplementation;.Как мне удалить эту ошибку.Как мне получить доступ к fibonacciImplementation?Кажется, что геттер и сеттер не работают. Компилятор говорит fibonacciImplementation has private access in FibonacciTest.

Имейте в виду, требование должно быть частным полем.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вам действительно нужно поле вообще?Если экземпляры реализующих классов не дороги в создании, вы можете просто получить экземпляр только тогда, когда вам это нужно, не нужно хранить его в поле.

abstract class FibonacciTest {

  abstract FibonacciImplementation createFibonacciImplementation();

  @Test
  void invalidPosition(){
    assertEquals(new BigInteger("-2"),
      createFibonacciImplementation().calculateFib(-2));
  }

}


public class RecursiveFibonacciTest extends FibonacciTest{

  @Override
  FibonacciImplementation createFibonacciImplementation(){
    return new RecursiveFibonacciImplementation();
  }

}
0 голосов
/ 24 октября 2018

private означает, что к нему можно получить доступ только из одного класса.Если вы хотите, чтобы поле было доступно только для подклассов, пометьте его как protected.

Измените это:

private FibonacciImplementation fibonacciImplementation;

На это:

protected FibonacciImplementation fibonacciImplementation;

В классе FibonacciTest.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...