Originalmente tenía un problema de diseño en el que necesitaba cinco subclases de una superclase, donde todas menos dos usarían el mismo método genérico de hacer las cosas y las otras dos necesitarían un manejo especial. Quería evitar escribir el método cinco veces; dos casos especiales y tres idénticos.¿Cómo llamar a métodos anulados en una subclase? Posible candidato para la refactorización
Así que todas las clases heredaban SuperClass y su método doSomething(), y tenían SubClassSpecial1 y SubClassSpecial2 que reemplazaban con su propio método doSomeThing.
Esto era todo muy bien hasta que escribí un método que parecía algo así como
void fooBar(SuperClass obj) {
obj.doSomething()
}
y que podría ser llamado como fooBar(new SubClassSpecial1());
El problema es que la clase en tiempo de ejecución de la variable obj
es ahora la de su superclase, y por lo tanto llamará a los métodos definidos en la superclase. Por supuesto, podría hacer un método abstracto doSometing() en la superclase, y hacer que cada subclase implemente su propia versión, pero eso duplicaría el código en tres de las clases. Y quiero evitar hacer eso ...
que iba a perder cualquier ganancia polimorfismo da si tuviera una gran cantidad de ramificación a través
if(obj.getClass().getName() == "SubClassSpecial1") ((SubClassSpecial1) obj).doSomething()K;
else if ...
Entonces, ¿qué debo hacer con el fin de hacer el diseño más elegante y no-hackish?
Este artículo debe al menos etiquetarse con el lenguaje de programación con el que está codificando. –
fijo. agregué una etiqueta java Gracias. pero pensé que este era un problema de diseño general que iba más allá de las barreras del idioma. – oligofren
¿Puede darnos los encuadres de sus definiciones de clase? –