У меня есть три класса ниже 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
?
Большое спасибо. Я знаю, что этот вопрос задавали. здесь - это тот же вопрос, но не было кода, который бы соответствовал вопросу или ответу, поэтому для меня это было немного абстрактно.
Неправда. Родительский класс может быть abstract
, и в этом случае именно дочерний класс вынужден реализовывать методы, если, конечно, он также не abstract
. Любой неабстрактный класс должен реализовать все абстрактные методы, которые он наследует от своего родителя или интерфейсов.
Это просто потому, что дочерний элемент получает доступ ко всем родительским методам, а также к переопределенным методам из интерфейса.
Вы можете снова переопределить эти методы, но тогда вам нужно вызвать super.someMethod()
, если вам нужно вызвать реализацию родителей.
Animal уже реализует AnimalActions, поэтому любому классу, который расширяет Animal, не нужно реализовывать методы AnimalActions. Чтобы быть более очевидным, вы можете просто использовать
public class Human extends Animal{
, потому что вам не нужно реализовывать уже реализованные действия AnimalActions родительского класса в дочернем классе, но при желании вы можете их переопределить.