Мне нужен совет, если мой абстрактный класс должен быть интерфейсом (или наоборот) - PullRequest
3 голосов
/ 30 октября 2019

У меня есть объекты моделирования иерархии наследования в моей игре JavaFX. У меня есть 4 типа врагов в моей игре, однако им нужна только реализация методов по умолчанию в Entity (абстрактный класс) + 1 дополнительный метод, для которого каждый враг предоставит свою реализацию. В будущем больше не будет врагов. Исходя из этого, я считаю, что Enemy должен быть интерфейсом.

Так что мой вопрос: правильно ли я считаю, что Enemy должен быть интерфейсом над абстрактным классом?

Вот моя диаграмма классов(в настоящее время с противником в качестве абстрактного класса):

Class Diagram

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Выбор интерфейса вместо абстрактного класса всегда хорош, поскольку он позволяет extension вашего приложения.

До Java-8 абстрактные классы были способом предоставления общих частичных реализаций, так как раньше интерфейсы java-8 не могли иметь определения методов.

В Java-8 интерфейсыесть методы по умолчанию, которые допускают общие определения определений.

Следовательно, я рекомендую использовать здесь интерфейс и предоставлять методы по умолчанию. И если вам нужно предоставить какую-то дополнительную реализацию, выходящую за рамки контракта, вы всегда можете выбрать абстрактные или конкретные значения.

В вашем случае любое представление сущности должно быть поддержано интерфейсом.

Итак, ваша диаграмма выглядит примерно так:

interface Entity extends cloneable{
//...
}

interface Enemy extends Entity{
//...
}

interface User extends Entity, Serializable{
//...
}

class Player implements  User {
//...
}

class Dragon implements Enemy{
//...
}
0 голосов
/ 30 октября 2019

На протяжении всего моего опыта программирования, когда бы я ни использовал абстрактный класс для абстракции, я всегда оказывался неправым со временем. Как правило, в ООП один класс может быть разным для разных потребителей, поэтому, чтобы иметь такую ​​гибкость и избежать ограничения в будущем из-за того, что у класса может быть только один родитель, я узнал, что абстракции всегда должны быть интерфейсами. ,

Абстрактные классы, с другой стороны, используются для предоставления общих функциональных возможностей различным реализациям интерфейса, но даже в этом случае я бы попытался «отдать предпочтение композиции над наследованием».

Итак, мой совет - всегда программировать на интерфейсы.

0 голосов
/ 30 октября 2019

Это зависит. Если враг всегда является сущностью (я полагаю, это потому, что вы должны знать его текущую ячейку и т. Д.), То лучше сделать его абстрактным классом, расширяющим сущность. Это исключает возможность того, что экземпляр Enemy (как определенный класс или анонимный, что угодно) не является сущностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...