Итак, я только начинаю писать игру на Java и пишу свои игровые объекты. Я прочитал здесь, в Evolve Your Hierarchy , что вы должны строить свои игры как композиции, а не как большую иерархию классов. Как показано на этом изображении из предыдущей ссылки:
Однако, когда я фактически перехожу к реализации, у меня возникает один небольшой вопрос о том, где применять интерфейсы.
Допустим, у вас есть класс Player и интерфейсы Moveable и Renderable. . Вы реализуете это, используя переменные общедоступного интерфейса:
class Player {
public Moveable moveable;
public Renderable renderable;
}
class GenericMoveable implements Moveable {
// Function implementations
}
class PlayerRenderable implements Renderable {
// Function implementations
}
Или вы пытаетесь сделать это, применяя интерфейсы непосредственно к объекту:
class Player implements Moveable, Renderable {
private GenericMoveable genericMoveable;
// Non-direct Implementation of Moveable
void someMoveFunc(double x, double y) {
genericMoveable.someMoveFunc(x, y);
}
// Direct implementation of Renderable
void someRenderableFunction() {
// Player class specific code
}
}
class GenericMoveable implements Moveable {
// Function implementations
}
В настоящее время я чувствую, что второй метод лучше. Основная причина этого в том, что я могу создавать следующие списки:
List renderObjects; // use this to draw all of the objects to the screen
List moveObjects; // use this to move all objects at once
Мне действительно просто нужно подтверждение, что я на правильном пути. Я почти уверен, что при создании игровых объектов по композиции для игр на Java вы хотите применить интерфейсы непосредственно к рассматриваемому игровому объекту, а затем использовать частные интерфейсы, если они вам нужны, и прямую реализацию этих функций для остальных. Это правильно? И каковы положительные и отрицательные стороны того, что я делаю?
Хотя, пока мы здесь, на что еще мне нужно обратить внимание при реализации композиционных игровых объектов на Java? Что мне делать иначе? Заранее благодарим за любые ответы, я благодарен за любую помощь.