Hallo zusammen, folgendes Problem:
Ich experimentiere gerade in Richtung "Entity Component System", dabei soll gelten, dass ein Entity nur eine ID ist und sonst nichts. In meinem Fall ist es eine UUID. Um den internen Typen der ID zu abstrahieren, habe ich eine Klasse "Entity" erstellt:
Da alle Spiel-Objekte "Entities" sind kann es z.B. für ein Inventory zu solchem Code kommen:
Das ist etwas undurchsichtig, darum hatte ich so etwas vor, hier exemplarisch für "Player":
Eigentlich ist das nur ein anderer Name für den selben Inhalt. Schade das es in Java kein using Player = Entity; gibt, wie bei C++.
Damit würde das Beispiel von oben zu folgendem:
Entities sollen von einem EntityManager erzeugt und verwaltet werden (hier noch sehr rudimentär) und hier kommt nun das Problem. Der EntityManager soll natürlich ein Objekt vom benötigten Entity-Typen erzeugen und nicht ein allgemeines Entity:
Der Cast schlägt allerdings fehl, vermutlich weil es ein Downcast zur Childklasse ist.
Lässt sich das Problem irgendwie lösen?
Ich experimentiere gerade in Richtung "Entity Component System", dabei soll gelten, dass ein Entity nur eine ID ist und sonst nichts. In meinem Fall ist es eine UUID. Um den internen Typen der ID zu abstrahieren, habe ich eine Klasse "Entity" erstellt:
Java:
public class Entity
{
private final UUID id;
public Entity(final UUID id)
{
Objects.requireNonNull(id);
this.id = id;
}
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Entity entity = (Entity) o;
return id.equals(entity.id);
}
@Override
public int hashCode()
{
return id.hashCode();
}
}
Da alle Spiel-Objekte "Entities" sind kann es z.B. für ein Inventory zu solchem Code kommen:
Java:
Map<Entity, List<Entity>> inventoryForPlayer;
Das ist etwas undurchsichtig, darum hatte ich so etwas vor, hier exemplarisch für "Player":
Java:
public final class Player extends Entity
{
public Player(final UUID id)
{
super(id);
}
}
Eigentlich ist das nur ein anderer Name für den selben Inhalt. Schade das es in Java kein using Player = Entity; gibt, wie bei C++.
Damit würde das Beispiel von oben zu folgendem:
Java:
Map<Player, List<Item>> inventoryForPlayer;
Entities sollen von einem EntityManager erzeugt und verwaltet werden (hier noch sehr rudimentär) und hier kommt nun das Problem. Der EntityManager soll natürlich ein Objekt vom benötigten Entity-Typen erzeugen und nicht ein allgemeines Entity:
Java:
public final class EntityManager
{
public <T extends Entity> T createEntity()
{
final T entity = (T) new Entity(UUID.randomUUID());
return entity;
}
}
Der Cast schlägt allerdings fehl, vermutlich weil es ein Downcast zur Childklasse ist.
Lässt sich das Problem irgendwie lösen?
Zuletzt bearbeitet: