Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

Что правильнее использовать, абстрактный класс, в котором все методы абстрактные или несколько интерфейсов?

Например, есть абстрактный класс АбстрактныйАвтомобиль У него есть 4 метода - повернутьНалево(), повернутьНаправо(), начатьДвижение(), затормозить() Есть 3 наследника - ШевролеКруз, ШевролеЛанос и ФордМондео. Я не разбираюсь в автомобилях, но предположим что поворот руля налево, поворот руля направо, начала движения и торможение для разных марок автомобилей реализовано по-разному. То есть мы не можем реализовать ни один из методов в классе АбстрактныйАвтомобиль. Придется их все сделать абстрактными. А в классах ШевролеКруз, ШевролеЛанос, и ФордМондео реализовать эти методы для каждого по-своему. Или же правильнее объявить 3 интерфейса - Turnable с методами повернутьНалево() и повернутьНаправо(), Startable с методом начатьДвижение() и Stopable с методом затормозить()?
Читал, что нужно мыслить на уровне интерфейсов, а не классов. И что вообще абстрактный класс, в котором есть только абстрактные методы - плохой тон. С другой стороны читал что если есть отношение является то нужно использовать наследование. А тут явно есть отношение является. Что же тут правильнее использовать? Растолкуйте пожалуйста.
UPD: Написали, что есть дубликат моего вопроса, вот он: Отличия абстрактного класса от интерфейса (abstract class and interface) По-моему это все-таки не совсем то.. Там просто разбираются отличия абстрактного класса от интерфейса. Я перечитал много таких статей прежде чем задавать вопрос. Если бы они для меня все прояснили, я бы его и не стал задавать. Мне была интересна именно ситуация, когда и отношения является есть и связь между классами, но при этом абстрактный класс вынужден иметь только абстрактные методы. Конечно я понимаю, что если в классах 10 методов реализовываются одинаково а один нет, то надо применять наследование. А вот в описанной выше ситуации я не понимал что нужно делать.


Ответ

Прелесть интерфейсов в вашем контексте вы оцените, когда у вас появится другое транспортное средство, например мотоцикл.
К примеру у вас будет интерфейс:
public interface Movable{ public void Move(); }
Тогда, вы можете реализовать в нужных классах его, что будет обозначать, что средство может двигаться. Теперь вы можете в одну коллекцию сложить разные классы List, где могут быть и мотоциклы, и машины. В случае с абстрактным классом у вас бы такое не получилось.
Проблема, лично для меня, абстрактных классов в том, что при использование вы завязываетесь на конкретную реализацию.
И что вообще абстрактный класс, в котором есть только абстрактные методы - плохой тон.
Это вообще бессмысленно. Делать абстрактный класс имеет смысл, если у вас много общей логики, которую вы в него вынесите.

Комментариев нет:

Отправить комментарий