Scusate per il titolo scarso, non riesco a pensare a un modo succinto di mettere questo ..È possibile evitare l'uso della verifica del tipo in questo esempio?
Sto pensando di avere una lista di oggetti che saranno tutti di una specifica interfaccia. Ognuno di questi oggetti può quindi implementare ulteriori interfacce, ma non è garantito quale oggetto implementerà quale. Tuttavia, in un singolo ciclo, desidero essere in grado di chiamare i metodi di qualunque sia il loro ulteriore sottotipo.
Ie, 3 interfacce:
public interface IAnimal { ... }
public interface IEggLayer { public Egg layEgg(); }
public interface IMammal { public void sweat(); }
questo sarebbe poi memorizzata come
private List<IAnimal> animals= new ArrayList<IAnimal>();
modo, istanze aggiunti all'elenco potrebbe anche essere di tipo IEggLayer
o IMammal
, che hanno completamente estranei metodi.
Il mio istinto sarebbe quello di poi fare
for(IAnimal animal : animals) {
if(animal instanceof IEggLayer) {
egg = ((IEggLayer)animal).layEgg();
}
if(animal instance of IMammal) {
((IMammal)animal).sweat();
}
}
ma ho sempre stato detto che il controllo di tipo è un segno che il codice in realtà dovrebbe essere riscritta.
Dal momento che potrebbe essere possibile per un singolo oggetto eseguire entrambi [ornitorinco, ad esempio], nel senso che un singolo doFunction()
non sarebbe adatto qui, è possibile evitare l'uso del controllo di tipo in questo caso, oppure è un esempio in cui il controllo del tipo è classificato come accettabile?
Esiste forse un motivo di progettazione adatto a questo?
Mi scuso per l'esempio inventato così ...
[Ignorare eventuali errori di sintassi, si prega - è destinato solo per essere simile a Java pseudocodice]
Ho aggiunto lvalue all'uso EggLayer, a mostra che a volte il tipo di reso è importante
questo codice sembra essere java, perché la bandiera C#? –
perché qualcun altro l'ha aggiunto. Posso rimuovere il tag java che è stato aggiunto anche io, poiché spero di mantenere questa lingua indipendente – Farrell