169 похожих чатов

Сейчас изучаю Джаву, ООП и конкретно сейчас пытаются обуздать композицию. Вот

у меня есть два класса: Кот и Собака. Они оба умеют издавать звуки и, простите, гадить (лучше не придумал). Звуки они издают по-разному, а вот гадят одинаково.

Можно было бы создать класс Животное, имеющее метод гадить, от которого бы наследовались мои Кот и Собака, дальше указывая для себя собственные методы издавания звуков, но есть нюанс.

У меня также есть класс Робот с методом двигаться. От этого класса наследуются РоботУборщик и РоботУбийца, у которых у каждого есть свои особые методы.

Теперь я хочу создать МяукающийРобот. Ему необходимо двигаться и мяукать. Впихнуть такое в имеющуюся иерархию наследования, насколько я понимаю, не получится.

И тут, как мне кажется, хорошо подошла бы композиция.

Вот отсюда уже начинается вопрос. Каким образом будет лучше это "отрефакторить" и добавить в код класс МяукающийРобот?

Я пришел к тому, что выделил интерфейс 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.

И дальше я легко могу добавить таким же образом возможность мяуканья роботу.

Что вы можете сказать про такой вариант решения проблемы?

Я ещё очень мало знаю и разбираюсь в ООП, подскажите, как можно сделать лучше?

6 ответов

7 просмотров

создать интерфейс - в нем все действия с объектами

https://www.bestprog.net/uk/2019/04/01/abstract-classes-abstract-methods-keyword-abstract-examples-ua/ сори что на украинском, но другие сайты не открывает

synalice- Автор вопроса

У меня возможность мяуканья должна быть и у класса Кот, и у класса МяукающийРобот одинаковой. Я не понимаю, как мне с этим поможет интерфейс. Я не хочу втупую копипастить код.

synalice- Автор вопроса
George
https://www.bestprog.net/uk/2019/04/01/abstract-cl...

Ну так я знаю, что такое абстрактные классы. Чем это здесь поможет?

synalice- Автор вопроса

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
9
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
Карта сайта