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