Принудительная реализация toString () в подклассах - PullRequest
13 голосов
/ 04 января 2012

У меня есть абстрактный родительский класс, и я бы хотел, чтобы заставил все подклассы реализовать метод toString ().

Однако сдача:

public abstract String toString();

вызывает ошибку компиляции:

Repetitive method name/signature for method 'java.lang.String toString()' in class ...

Я полагаю, это может быть вызвано тем, что groovy уже определил toString.

Спасибо

Ответы [ 5 ]

16 голосов
/ 19 сентября 2013

Это работает для меня.Это новое или просто пропустили другие?

public abstract class Filterable
{
  @Override
  public abstract String toString();
}

public class ABC extends Filterable
{
  // Won't compile without toString();
}
12 голосов
/ 04 января 2012

toString() является частью класса java.lang.Object, в котором уже есть реализация по умолчанию.Таким образом, вы по существу не можете заставить подклассы реализовать это.Если вы хотите вызвать такое поведение (не знаете почему), вы можете сделать что-то вроде ниже

public class abstract SuperClass {
  public abstract String myToString();

  public String toString() {
    return myToString();
  }
}
7 голосов
/ 04 января 2012

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

public final String toString() {
    getString();
}

public abstract String getString();

Это заставит дочерний класс реализовать метод "getString ()".Однако дочерний класс дочернего (внучатого) не гарантирует принудительной реализации этого метода, если дочерний класс реализует метод getString ().Пример:

A is the parent class, with the getString() method.
B extends A, and implements the getString() method.
C extends B, doesn't have to implement the getString() method.

Надеюсь, это поможет:)

0 голосов
/ 20 апреля 2017

Вы можете написать модульный тест, который найдет все классы, расширяющие ваш абстрактный класс, и проверит, что они объявляют toString (). Для сканирования вы можете использовать Reflections library:

  @Test
  public void validateToString() {
    final Reflections dtoClassesReflections = new Reflections(new ConfigurationBuilder()
      .setUrls(ClasspathHelper.forPackage("my.base.package"))
      .filterInputsBy(new FilterBuilder()
        .include(".*Dto.*") // optionally filter only some particular classes
        .exclude(".*Test.*")) // exclude classes from tests which will be scanned as well
      .setScanners(new SubTypesScanner(false)));

    final Set<Class<?>> allDtoClasses = dtoClassesReflections.getSubTypesOf(YourAbstractClass.class); // you set your class here (!!). You can set Object.class to get all classes

    allDtoClasses.forEach(dtoClass -> {
      logger.info("toString() tester testing: " + dtoClass);

      try {
        dtoClass.getDeclaredMethod("toString");
      } catch (NoSuchMethodException e) {
        fail(dtoClass + " does not override toString() method");
      }
    });


  }
0 голосов
/ 04 января 2012

Вы не можете заставить их переопределить toString (), но вы могли бы, в абстрактном родительском классе, чтобы toString () вызывал другой m абстрактный метод, youGottaOverideToString (), который подклассы должны будут реализовать.

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