es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Heredar múltiples clases abstractas en Java

Tengo dos clases abstractas llamadas FlyingBird y RunningBird

public abstract FlyingBird extends Bird implements IFlyingBird {}
public abstract RunningBird extends Bird implements IRunningBird {}

Ahora quiero tener otra clase abstracta que sea tanto IRunningBird como IFlyingBird

public abstract FlyingRunningBird extends Bird implements IFlyingBird, IRunningBird {}

En esta clase estoy duplicando todo el código de FlyingBird y RunningBird
La agregación de clases dependientes no es posible ya que ambas clases son abstractas

El problema es que si se realiza una corrección de errores o modificación en FlyingBird o RunningBird, no se reflejará en FlyingRunningBird. Necesito actualizar también FlyingRunningBird.

¿Hay alguna forma de evitar esta duplicación de código en FlyingRunningBird? o
¿Usar FlyingBird y RunningBird en FlyingRunningBird para evitar la duplicación de código?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, podemos evitar la duplicación de código en FlyingRunningBird utilizando composición en lugar de herencia. Podemos crear variables de instancia de las clases FlyingBird y RunningBird en FlyingRunningBird y delegar la implementación de sus métodos a estas variables de instancia. De esta manera, cualquier modificación o corrección de errores realizada en FlyingBird o RunningBird se reflejará automáticamente en FlyingRunningBird.

    Código de ejemplo:

    public abstract class FlyingRunningBird extends Bird implements IFlyingBird, IRunningBird {
    
        private FlyingBird flyingBird;
        private RunningBird runningBird;
    
        public FlyingRunningBird() {
            flyingBird = new FlyingBird();
            runningBird = new RunningBird();
        }
    
        @Override
        public void fly() {
            flyingBird.fly();
        }
    
        @Override
        public void run() {
            runningBird.run();
        }
    }
    

    Con esta implementación, hemos evitado la duplicación de código y nos hemos asegurado de que cualquier cambio realizado en FlyingBird o RunningBird se refleje automáticamente en FlyingRunningBird.

Comments are closed.