Encontrar todos os objetos que é um filho de um Tipo de Dado em Java

Jinan Dangor:

Atualmente estou escrevendo um jogo de puzzle baseado em grid, e ter executado em um problema.

Eu tenho uma classe Sprite abstrato onde cada Sprite representa algum objeto no meu mapa (um jogador, uma parede, etc). Esta classe Sprite tem filhos (Item, entidade, Obstáculo), e estas crianças têm filhos (artigo tem InventoryItem e InstantUseItem), e assim por diante. Apenas as crianças sem quaisquer outras crianças não são abstratas, então você só pode concreta instanciar objetos que você pode encontrar no jogo (você pode instanciar Espada e Flecha, mas não Weapon - seu objeto pai).

Meu problema é que eu estou armazenando todos os objetos em telhas (cada mapa tem largura altura * Azulejo) em um Sprite ArrayList, e agora eu quero fazer algo como achado que telha o objeto Player está ligado, ou encontrar todas as peças que contêm objetos inimigos (ou classes que herdam-los).

O problema é que, tanto quanto eu posso dizer, eu não posso fazer algo parecido com isso no meu mapa ou Tile objeto:

public ArrayList<t> findAllSpritesOfType(Type t) {
    ArrayList<t> sprites = new ArrayList<t>();
    for(Sprite s : this.getSprites()) {
        if(s instanceof t) {
            sprites.add((t) s); //Add after casting to right class
        }
    }
    return sprites;
}

Mesmo se eu tentar implementar uma função estática no Sprite, eu preciso disso (uma espécie de 'covariância automática' entre todos os filhos de Sprite):

public static ArrayList<this.Type> getSpritesOnTile(Tile t) {
    ArrayList<this.Type> sprites = new ArrayList<this.Type>();
    for(Sprite s : t.getSprites()) {
        if(s instanceof this.Type) {
            sprites.add((this.Type) s); //Add after casting to right class
        }
    }
    return sprites;
}

Os outros métodos que eu ter pensado envolvem:

  1. Tornando o método último retornar um array de Sprites, em seguida, substituir este método em todas as crianças para retornar uma matriz de crianças usando covariância.
  2. Fazendo Sprite conter isWeapon (), isItem (), isEntity (), etc, (que tudo falso retorno), em seguida, substituir estes métodos nas crianças apropriadas. Eu agora usar esses métodos em vez de um um método Type.isGivenType estática unificada () método isGivenType unificada (Type t), ou.

Certificar-se de meus conforma programa para objeto de princípios orientados, e continua sendo facilmente extensível, é muito importante para este projeto. Existe alguma maneira de implementar qualquer uma das minhas soluções, ou alcançar meu objetivo?

Alex:

Parece que este é o que você quer:

public <T extends Sprite> ArrayList<T> findAllSpritesOfType(Class<T> clazz) {
    ArrayList<T> sprites = new ArrayList<>();
    for(Sprite s : this.getSprites()) {
        if(clazz.isInstance(s)) {
            sprites.add((T) s);
        }
    }
    return sprites;
}

E então você pode usá-lo como este:

List<Item> items = findAllSpritesOfType(Item.class);

Outra maneira de fazer isso seria para retornar um fluxo, em vez de uma lista:

public <T extends Sprite> Stream<T> findAllSpritesOfType(Class<T> clazz) {
    return getSprites().stream().filter(clazz::isInstance).map(clazz::cast);
}

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=190459&siteId=1
Recomendado
Clasificación