Lo siento por el título pobre, no se me ocurre una forma concisa de poner esto ..¿Es posible evitar el uso de verificación de tipos en este ejemplo?
Estoy pensando en tener una lista de objetos que serán todos de una interfaz específica. Cada uno de estos objetos puede implementar más interfaces, pero no hay garantía de qué objeto implementará qué. Sin embargo, en un solo ciclo, deseo poder llamar a los métodos de cualquier otro subtipo que puedan ser.
Ie, 3 interfaces:
public interface IAnimal { ... }
public interface IEggLayer { public Egg layEgg(); }
public interface IMammal { public void sweat(); }
esto, entonces se almacena como
private List<IAnimal> animals= new ArrayList<IAnimal>();
así, instancias añadidos a la lista posiblemente también podría ser de tipo IEggLayer
o IMammal
, que tienen relación alguna métodos.
Mi instinto inicial sería luego hacer
for(IAnimal animal : animals) {
if(animal instanceof IEggLayer) {
egg = ((IEggLayer)animal).layEgg();
}
if(animal instance of IMammal) {
((IMammal)animal).sweat();
}
}
Pero siempre han dicho que la comprobación de tipos es una señal de que el código realmente debe ser rediseñado.
Dado que podría ser posible para un solo objeto hacer ambos [ornitorrincos, por ejemplo], lo que significa que un solo doFunction()
no sería adecuado aquí, ¿es posible evitar el uso de verificación de tipo en este caso? instancia donde la verificación de tipo se clasifica como aceptable?
¿Hay posiblemente un patrón de diseño atendido para esto?
Me disculpo por el ejemplo artificial, así ...
[Ignorar los errores de sintaxis, por favor - es sólo la intención de ser similar a Java pseudocódigo]
He añadido lvalue al uso egglayer, a muestre que a veces el tipo de devolución es importante
este código parece ser java, ¿por qué la marca C#? –
porque alguien más lo agregó. También puedo eliminar la etiqueta java que se ha agregado, ya que espero mantener este idioma independiente. – Farrell