Я пытаюсь реализовать свободный интерфейс в своем движке 2D-игры.
Упрощенный пример моей реализации:
public class Sprite<T> {
protected float x = 0.0;
protected float y = 0.0;
public T setPosition(float x, float y) {
this.x = x;
this.y = y;
return (T)this;
}
}
public class Living<T extends Living> extends Sprite<Living> {
protected boolean alive = false;
public T setAlive(boolean alive) {
this.alive = alive;
return (T)this;
}
}
public class Entity<T extends Entity> extends Living<Entity> {
protected String name = null;
public T setName(String name) {
this.name = name;
return (T)this;
}
}
Entity entity = new Entity().setPosition(100, 200).setAlive(true).setName("Zombie");
Я продолжаю получать сообщение об ошибке: "Функция setAlive(boolean) не существует."
Я знаю, используя мои методы наоборот (в более логическом порядке) работает:
Entity entity = new Entity().setName("Zombie").setAlive(true).setPosition(100, 200);
И я знаю, что сработает перезапись любых родительских сеттер-функций в каждом дочернем классе:
public class Entity extends Living {
protected String name = null;
public Entity setPosition(float x, float y) {
return (Entity)super.setPosition(x, y);
}
public Entity setAlive(boolean alive) {
return (Entity)super.setAlive(alive);
}
public Entity setName(String name) {
return (Entity)super.setName(name);
}
}
Но я хочу, чтобы интерфейс был максимально бесплатным/несложным для "конечного пользователя", а код был максимально компактен. и чистить по мере необходимости.
Я не знаю, то ли я просто испортил дженерики, то ли мой подход к дырам совершенно неверен. Я надеюсь, что вы можете помочь. Я открыт для любых советов. (Извините за мой плохой английский.)
Изменить: я уже тестировал следующий подход, и он работает для класса Entity.
public class Sprite<T> {
...
}
public class Living<T> extends Sprite<T> {
...
}
public class Entity extends Living<Entity> {
...
}
Я забыл упомянуть, что мне также нужно создать экземпляр Sprite & Living. Например:
Living living = new Living().setPosition(50, 50).setAlive(false);