Diciamo che sto scrivendo un certo codice di inventario:
public void showInventory(List<Item> items) {
for (Item item : items) {
if (item instanceof ContainerItem) {
// container display logic here
}
else if (item instanceof WeaponItem) {
// weapon display logic here
}
// etc etc
}
}
che compilerà e funzionano bene. Ma manca un'idea chiave del design orientato agli oggetti: È possibile definire le classi genitore per fare cose utili generali e fare in modo che le classi figlie inseriscano dettagli specifici importanti.
approccio alternativo sopra:
abstract class Item {
// insert methods that act exactly the same for all items here
// now define one that subclasses must fill in themselves
public abstract void show()
}
class ContainerItem extends Item {
@Override public void show() {
// container display logic here instead
}
}
class WeaponItem extends Item {
@Override public void show() {
// weapon display logic here instead
}
}
Ora abbiamo un posto per guardare, il metodo show()
, in tutte le nostre classi figlie per la logica di visualizzazione dell'inventario. Come lo accediamo? Facile!
public void showInventory(List<Item> items) {
for (Item item : items) {
item.show();
}
}
Stiamo mantenendo tutta la logica specifica per voce dentro specifiche sottoclassi Item. Ciò facilita la manutenzione e l'estensione del codice base. Riduce la deformazione cognitiva del ciclo lungo per ogni ciclo nel primo esempio di codice. Inoltre, è pronto per essere riutilizzato in luoghi che non hai ancora progettato, show()
.
fonte
2015-06-17 14:22:10
È possibile evitare la necessità di utilizzare instanceof se articolo definisce un metodo astratto, costringendo ogni sottoclasse di eseguire il proprio. – NickJ
Probabilmente ripensa la tua struttura. Lo schema che stai descrivendo è davvero un anti-modello. – MadConan
Sì, in generale l'uso di 'instanceof'' è un sintomo di un design cattivo/scarso. Il trucco è usare il doppio dispatch o modello di visitatore. Guarda sul web. –