JavaRush /Blog Java /Random-ES /Relaciones entre clases. Herencia, composición y agregaci...

Relaciones entre clases. Herencia, composición y agregación.

Publicado en el grupo Random-ES
¡Hola! Hoy veremos más de cerca otro principio de la programación orientada a objetos (POO): la herencia. Al mismo tiempo, estudiaremos otros tipos de relaciones entre clases: composición y agregación. Este tema no será difícil: ya te has encontrado muchas veces con la herencia y sus ejemplos en conferencias anteriores. Hoy lo principal será consolidar tus conocimientos, observar más de cerca el mecanismo de herencia y repasar una vez más los ejemplos :) Entonces, ¡vamos!
Relaciones entre clases.  Herencia, composición y agregación - 1

Herencia en Java y sus beneficios

Como probablemente recuerde, la herencia es un mecanismo que le permite describir una nueva clase basada en una existente (principal). En este caso, la nueva clase toma prestadas las propiedades y funcionalidades de la clase principal. Recordemos el ejemplo de herencia de conferencias anteriores:
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }


public void gas() {
       //...gas
   }

public void brake() {
       //...freno
   }
}


public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}



public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
Existe un programa determinado dentro del cual trabajamos con varios tipos de automóviles. Incluso si no es un entusiasta de los automóviles, probablemente sepa que hay muchos tipos de estos mismos automóviles en el mundo :) Por lo tanto, separamos las propiedades generales de los automóviles en una clase principal común: Car. ¿Qué tienen en común todos los coches, independientemente del tipo? Cualquier coche tiene año de fabricación, nombre del modelo y velocidad máxima. Ponemos estas propiedades en los campos model, maxSpeed, yearOfManufacture. En cuanto al comportamiento, cualquier coche puede acelerar y frenar :) Definimos este comportamiento en métodos gas()y brake(). ¿Qué beneficios nos aporta esto? En primer lugar, reducir la cantidad de código. Por supuesto, podemos prescindir de la clase principal. Pero como cada automóvil debe poder acelerar y frenar, tendremos que crear métodos gas()en brake()la clase Truck, en la clase Sedan, en la clase F1Car, en la clase Sportcary en todas las demás clases de automóviles. Imagínese cuánto código adicional escribiremos en este caso. No te olvides de los campos model, maxSpeed ​​​​y YearOfManufacture: si abandonamos la clase padre, ¡los crearemos en cada una de las clases de máquina! Relaciones entre clases.  Herencia, composición y agregación - 2 Cuando tengamos un par de docenas de clases de máquinas, la cantidad de código repetitivo será realmente grave. Mover campos y métodos comunes (también llamados "estado" y "comportamiento") a la clase principal nos permitirá ahorrar mucho tiempo y espacio. Si un determinado tipo tiene propiedades o métodos que son exclusivos de él y que están ausentes en otros tipos de máquinas, no importa. Siempre se pueden crear en una clase descendiente, por separado de todas las demás.
public class F1Car extends Car {

   public void pitStop() {

       //...solo los coches de carreras hacen paradas en boxes
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Tomemos el caso de los coches de carreras de Fórmula 1. Ellos, a diferencia de sus "parientes", tienen un comportamiento único: de vez en cuando se detienen para hacer una parada en boxes. Esto no nos molesta. Ya hemos descrito el comportamiento general en la clase principal Cary podemos agregar comportamiento específico de las clases descendientes dentro de las clases. Relaciones entre clases.  Herencia, composición y agregación - 3 Esto también se aplica a los campos: si una clase secundaria tiene propiedades únicas, podemos declarar tranquilamente estos campos dentro de ella y no preocuparnos :) La capacidad de reutilizar código es la principal ventaja de la herencia. Es muy importante que un programador no escriba cantidades innecesarias de código. Te encontrarás con esto más de una vez en tu trabajo. Recuerde una cosa más muy importante: no existe herencia múltiple en Java. Cada clase hereda de una sola clase. Hablaremos de las razones de esto con más detalle en futuras conferencias, pero por ahora solo recuerda. Esto, por cierto, distingue a Java de otros lenguajes de programación orientada a objetos. Por ejemplo, C++ tiene herencia múltiple. Con la herencia, todo está más o menos claro: sigamos adelante.

Composición y agregación

Las clases y los objetos pueden estar relacionados entre sí. La herencia describe la relación "es" (o en inglés "ES A"). Leo es un animal. Esta relación se puede expresar fácilmente mediante herencia, donde Animalla clase será la padre y Lionla clase será la hija. Sin embargo, no todas las relaciones en el mundo se describen de esta manera. Por ejemplo, un teclado definitivamente está conectado a una computadora de alguna manera, pero no es una computadora . Las manos están de alguna manera conectadas con la persona, pero no son la persona. En estos casos, se basa en un tipo diferente de relación: no “es”, sino “es parte” (“TIENE A”). La mano no es una persona, pero es parte de una persona. El teclado no es una computadora, pero es parte de la computadora. Las relaciones HAS A se pueden describir en código utilizando mecanismos de composición y agregación . La diferencia entre ellos radica en el “rigor” de estas conexiones. Pongamos un ejemplo sencillo: tenemos el nuestro Car: un coche. Cada coche tiene un motor. Además, cada coche tiene pasajeros en su interior. ¿Cuál es la diferencia fundamental entre campos Engine enginey Passenger [] passengers? Si un coche tiene un pasajero en su interior А, esto no significa que no pueda haber pasajeros en Bél C. Un coche tiene capacidad para varios pasajeros. Además, si se retiran todos los pasajeros del coche, este seguirá funcionando silenciosamente. La relación entre clase Cary masa de pasajeros Passenger [] passengerses menos estricta. Se llama agregación . Hay un buen artículo sobre este tema: Relaciones entre clases (objetos) . Proporciona otro buen ejemplo de agregación. Digamos que tenemos una clase Studentque denota un estudiante y una clase StudentsGroup(un grupo de estudiantes). Un estudiante puede ser miembro de un club de física, un club de fans de estudiantes de Star Wars o un equipo de KVN. La composición es un tipo de comunicación más estricto. Cuando se utiliza la composición, un objeto no sólo es parte de un objeto, sino que no puede pertenecer a otro objeto del mismo tipo. El ejemplo más sencillo es el motor de un coche. Un motor es parte de un automóvil, pero no puede ser parte de otro automóvil. Como puedes ver, su conexión es mucho más estricta que la de Cary Passengers. Relaciones entre clases.  Herencia, composición y agregación - 4
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION