Как заставить интерфейс присутствовать на всех уровнях наследования - PullRequest
0 голосов
/ 19 октября 2018

У меня есть интерфейс myIf, который я хотел бы иметь на всех уровнях наследования.Идея состоит в том, что fooEverywhere должно быть на GrandParent и Parent и дальше детей.Таким образом, эта очевидная закономерность имеет место:

  public interface myIf {
    void fooEverywhere ();
  }

  public class GrandParent implements myIf {

    @Override
    public void fooEverywhere() { /* Actions */ }

  }

  public class Parent extends GrandParent implements myIf {
    @Override
    public void fooEverywhere() { super.fooEverywhere(); /* And Other actions */ }
  }

Однако, если я забуду / пропущу Parent, как это:

  public class Parent extends GrandParent /*implements myIf*/ {
//    @Override
//    public void fooEverywhere() { super.fooEverywhere(); /* And Other actions */ }
  }

Java, все равно будет в порядке, так как parentObject.fooEverywhere() найдетGrandParent.fooEverywhere().

Поэтому, как я могу изменить это, чтобы заставить Java признать, что fooEverywhere должно быть в Parent?

Ответы [ 2 ]

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

Как вы уже сказали, компилятору все равно, если суперкласс обеспечивает реализацию абстрактного или интерфейсного метода.

Я с трудом могу представить какой-либо сценарий использования, где необходимо реализовать метод в каждом подклассе, но если вам это действительно нужно, вы можете реализовать решение, используя отражение с Class#getDeclaredMethods (возвращать только методы, объявленные в этом классе) проверить, реализует ли каждый из классов метод или переопределяет его.Если нет, выведите исключение.

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

Короткий ответ: вы не можете.

Более длинный ответ: вы не можете, потому что вы уже предоставили реализацию в классе выше в цепочке наследования.Как только он реализован выше в цепочке, он реализован.

Вы можете создать абстрактный класс в качестве предка, который реализует интерфейс, а затем объявить методы интерфейса как абстрактные для абстрактного предка.Затем GrandParent и Parent будут расширять AbstractParent и должны предоставлять свои собственные реализации методов интерфейса, которые были объявлены как абстрактные.

Обратите внимание, что интерфейсы в Java обычно представляют собой Pascal-case, т.е. MyIf, а не myIf.Кроме того, нет необходимости фактически использовать ключевое слово Implements в классе-потомке, родитель которого уже объявил, что реализует интерфейс.

...