у меня есть два класса: Кот и Собака. Они оба умеют издавать звуки и, простите, гадить (лучше не придумал). Звуки они издают по-разному, а вот гадят одинаково.
Можно было бы создать класс Животное, имеющее метод гадить, от которого бы наследовались мои Кот и Собака, дальше указывая для себя собственные методы издавания звуков, но есть нюанс.
У меня также есть класс Робот с методом двигаться. От этого класса наследуются РоботУборщик и РоботУбийца, у которых у каждого есть свои особые методы.
Теперь я хочу создать МяукающийРобот. Ему необходимо двигаться и мяукать. Впихнуть такое в имеющуюся иерархию наследования, насколько я понимаю, не получится.
И тут, как мне кажется, хорошо подошла бы композиция.
Вот отсюда уже начинается вопрос. Каким образом будет лучше это "отрефакторить" и добавить в код класс МяукающийРобот?
Я пришел к тому, что выделил интерфейс IVoice с методом speak(), который имплементируют классы Meow и Bark. Дальше у меня просто вот это:
private final Bark bark = new Bark();
private void speak() {
bark.speak();
}
...в классе Dog и вот это:
private final Meow meow = new Meow();
private void speak() {
meow.speak();
}
...в классе Cat.
И дальше я легко могу добавить таким же образом возможность мяуканья роботу.
Что вы можете сказать про такой вариант решения проблемы?
Я ещё очень мало знаю и разбираюсь в ООП, подскажите, как можно сделать лучше?
создать интерфейс - в нем все действия с объектами
https://www.bestprog.net/uk/2019/04/01/abstract-classes-abstract-methods-keyword-abstract-examples-ua/ сори что на украинском, но другие сайты не открывает
У меня возможность мяуканья должна быть и у класса Кот, и у класса МяукающийРобот одинаковой. Я не понимаю, как мне с этим поможет интерфейс. Я не хочу втупую копипастить код.
они у тебя одинаково будут мяукать?
Ну так я знаю, что такое абстрактные классы. Чем это здесь поможет?
Да. В этом и суть.
Обсуждают сегодня