Sobes.tech
Junior

¿Qué significan las relaciones "soy" y "tengo" en programación orientada a objetos?

sobes.tech AI

Respuesta de la IA

La relación "es-una" (is-a) es herencia. La clase derivada "es" una clase padre y hereda sus propiedades y comportamientos.

// Clase padre
class Animal {
    void eat() {
        System.out.println("El animal come");
    }
}

// Clase derivada
class Dog extends Animal {
    void bark() {
        System.out.println("El perro ladra");
    }
}

En este ejemplo, Dog "es" Animal.

La relación "tengo" (has-a) es composición o agregación. Un objeto "tiene" una referencia a otro objeto como parte de su estado.

class Engine {
    void start() {
        System.out.println("El motor arranca");
    }
}

class Car {
    private Engine engine; // El coche "tiene" un motor

    public Car() {
        this.engine = new Engine();
    }

    void drive() {
        engine.start();
        System.out.println("El coche conduce");
    }
}

Aquí, Car "tiene" Engine. La composición implica una relación fuerte (el ciclo de vida del objeto contenido depende del que lo contiene), la agregación es más débil (los objetos pueden existir independientemente). En el ejemplo se muestra composición.

Diferencias clave:

  • "Es-una" (is-a) — herencia, define una jerarquía de tipos.
  • "Tengo" (has-a) — composición/agregación, define la estructura del objeto mediante la inclusión de otros objetos.