Если и дочерний класс, и родительский класс реализуют один и тот же интерфейс, почему только родительский класс вынужден добавлять нереализованные методы?

У меня есть три класса ниже AnimalActions интерфейса и два других класса Animal, которые являются родителем Human

Интерфейс AnimalActions выглядит следующим образом:

public interface AnimalActions {

  public String greeting(); // how an animal says hello

  public String angryAction(); // how an animal says "im angry"

  public String happyAction(); // how an animal says "im happy"
}

Когда у меня есть реализация класса Animal, я получаю ошибку компилятора, заставляющую меня добавлять нереализованные методы, поэтому класс должен выглядеть так:

public class Animal implements AnimalActions {

  @Override
  public String greeting() {
    return "default greeting";
  }

  @Override
  public String angryAction() {
    return "default angry action";
  }

  @Override
  public String happyAction() {
    return "default happy";
  }

}

Но когда я затем создаю класс AnimalActions, который расширяет Human и реализует Animal, нет ошибки компилятора, заставляющей меня переопределять методы. Это вполне приемлемо для Eclipse.

public class Human extends Animal implements AnimalActions{

}

Однако я могу добавить нереализованные методы и изменить их с AnimalActions, если захочу. Меня просто не заставляют это делать.

Странно то, что если я уберу Animal из этого класса, то мне придется добавить нереализованные методы. Почему бы мне не добавить нереализованные методы?

Каждый раз, когда я думаю, что понимаю ООП, меня смущает что-то вроде этого. Это полная «ерунда» иметь родительский и дочерний классы, реализующие один и тот же интерфейс? Может быть, лучше иметь только extends Animal?

Большое спасибо. Я знаю, что этот вопрос задавали. здесь - это тот же вопрос, но не было кода, который бы соответствовал вопросу или ответу, поэтому для меня это было немного абстрактно.

Animal уже реализует AnimalActions, поэтому любому классу, который расширяет Animal, не нужно реализовывать методы AnimalActions. Чтобы быть более очевидным, вы можете просто использовать public class Human extends Animal{, потому что вам не нужно реализовывать уже реализованные действия AnimalActions родительского класса в дочернем классе, но при желании вы можете их переопределить.

sorifiend 09.05.2022 06:17

Неправда. Родительский класс может быть abstract, и в этом случае именно дочерний класс вынужден реализовывать методы, если, конечно, он также не abstract. Любой неабстрактный класс должен реализовать все абстрактные методы, которые он наследует от своего родителя или интерфейсов.

user207421 09.05.2022 06:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это просто потому, что дочерний элемент получает доступ ко всем родительским методам, а также к переопределенным методам из интерфейса. Вы можете снова переопределить эти методы, но тогда вам нужно вызвать super.someMethod(), если вам нужно вызвать реализацию родителей.

Другие вопросы по теме