Java

Абстрактный класс или интерфейс (java)

Не могу никак определиться, чем воспользоваться.
Есть несколько зданий например (Ратуша, ферма и башня) у каждой есть хп, но у фермы нет брони, а башня умеет атаковать, как лучше, реализовать интерфейс здания или абстрактный класс (И такой вопрос, придется задавать в каждом хп, через интовскую переменную, нужно ли указывать ее в абстрактном классе ?)
Подход должен быть следующий : Делаешь пустой базовый класс - от него наследуешся, замечаешь общий код - выносишь его в базовый класс; Видишь общие методы (которые должны быть видны снаружи) выносишь их в интерфейс. Абстрактный класс с приходом java8 стал рудиментарным его можно игнорировать (до тех пор пока не почувствуешь тонкую грань между интерфейсом классом и абстрактным-классом).
Арман Орынбаев
Арман Орынбаев
6 169
Лучший ответ
ну в натуре. Ты же не научную работу пишешь, и 10 000 гугл програмистам с твоим кодом не работать. Лучший совет от меня, делай как проще и как тебе понятнее. Уж поверь, нах никому твоя цепочка наследований интерфейсов не нужна, только если ты не один из 10 000 тех самых и остальные 9999 не должны будут понять твою мысль.
На одинаковый функционал пишешь интерфейсы типа стрелок (может стрелять)
башня стреляет солдат стреляет, но башня здание а солдат единица, разные объекты но с общим функционалом. Логику выстрела тоже вынести нужно в отдельный класс. Типа ЮнитЛогиксо статическими методами. Так каждый объект реализующий интерфейс стрелок будет обращаться внутри преопределенных методов к статическим методам этого класса ЮнитЛогик. Расчет в одном месте. Но только так, если реально видишь разницу, то разделяй. Если один делает пук вправо другой пук влево, не надо городить лишнюю цепочку наследования (бесполезную). Ты должен хорошо подумать нужно ли это тебе, твоей маме, друзьям или господу богу, и только тогда создавай новую иерархию наследования.