JavaRush /Blogue Java /Random-PT /Relações entre classes. Herança, composição e agregação

Relações entre classes. Herança, composição e agregação

Publicado no grupo Random-PT
Olá! Hoje examinaremos mais de perto outro princípio da programação orientada a objetos (OOP) - herança. Ao mesmo tempo, estudaremos outros tipos de relações entre classes – composição e agregação. Este tópico não será difícil: você já encontrou herança e seus exemplos muitas vezes em palestras anteriores. Hoje o principal será consolidar seus conhecimentos, olhar mais de perto o mecanismo de herança e mais uma vez repassar os exemplos :) Então, vamos lá!
Relações entre classes.  Herança, composição e agregação - 1

Herança em Java e seus benefícios

Como você provavelmente se lembra, herança é um mecanismo que permite descrever uma nova classe com base em uma existente (pai). Nesse caso, as propriedades e funcionalidades da classe pai são emprestadas pela nova classe. Vamos lembrar o exemplo de herança de palestras 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() {
       //...brake
   }
}


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 um determinado programa dentro do qual trabalhamos com vários tipos de carros. Mesmo que você não seja um entusiasta de carros, provavelmente sabe que existem muitos tipos desses mesmos carros no mundo :) Portanto, separamos as propriedades gerais dos carros em uma classe pai comum - Car. O que todos os carros têm em comum, independentemente do tipo? Qualquer carro tem ano de fabricação, nome do modelo e velocidade máxima. Colocamos essas propriedades nos campos model, maxSpeed, yearOfManufacture. Quanto ao comportamento, qualquer carro pode acelerar e frear :) Definimos esse comportamento nos métodos gas()e brake(). Que benefícios isso nos traz? Em primeiro lugar, reduzindo a quantidade de código. Claro, podemos passar sem a classe pai. Mas como todo carro deve ser capaz de acelerar e frear, teremos que criar métodos gas()na brake()classe Truck, na classe Sedan, na classe F1Car, na classe Sportcare em todas as outras classes de carros. Imagine quanto código extra escreveremos neste caso. Não se esqueça dos campos model, maxSpeed ​​​​e yearOfManufacture: se abandonarmos a classe pai, iremos criá-los em cada uma das classes de máquina! Relações entre classes.  Herança, composição e agregação - 2 Quando tivermos algumas dezenas de classes de máquinas, a quantidade de código repetitivo se tornará muito séria. Mover campos e métodos comuns (também chamados de “estado” e “comportamento”) para a classe pai nos permitirá economizar muito tempo e espaço. Se um determinado tipo possui propriedades ou métodos que são exclusivos apenas dele e estão ausentes em outros tipos de máquinas, não importa. Podem sempre ser criados numa classe descendente, separadamente de todas as outras.
public class F1Car extends Car {

   public void pitStop() {

       //...only racing cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Veja o caso dos carros de corrida de Fórmula 1. Eles, ao contrário de seus “parentes”, têm um comportamento único - de vez em quando fazem um pit stop. Isso não nos incomoda. Já descrevemos o comportamento geral da classe pai Care podemos adicionar o comportamento específico das classes filhas dentro das classes. Relações entre classes.  Herança, composição e agregação - 3 Isso também se aplica aos campos: se uma classe filha tiver propriedades únicas, podemos declarar esses campos com segurança dentro dela e não nos preocupar :) A capacidade de reutilizar código é a principal vantagem da herança. É muito importante para um programador não escrever quantidades desnecessárias de código. Você encontrará isso mais de uma vez em seu trabalho. Lembre-se de mais uma coisa muito importante: não existe herança múltipla em Java. Cada classe herda de apenas uma classe. Falaremos sobre as razões para isso com mais detalhes em palestras futuras, mas por enquanto lembre-se. A propósito, isso distingue Java de algumas outras linguagens OOP. Por exemplo, C++ tem herança múltipla. Tudo fica mais ou menos claro com herança - vamos em frente.

Composição e Agregação

Classes e objetos podem estar relacionados entre si. A herança descreve o relacionamento "é" (ou em inglês "IS A"). Leão é um animal. Esse relacionamento pode ser facilmente expresso usando herança, onde Animala classe será o pai e Liona classe será o filho. No entanto, nem todos os relacionamentos no mundo são descritos desta forma. Por exemplo, um teclado está definitivamente conectado a um computador de alguma forma, mas não é um computador . As mãos estão de alguma forma ligadas à pessoa, mas não são a pessoa. Nestes casos, baseia-se num tipo diferente de relação: não “é”, mas “faz parte” (“TEM A”). A mão não é uma pessoa, mas faz parte de uma pessoa. O teclado não é um computador, mas faz parte do computador. Os relacionamentos HAS A podem ser descritos em código usando mecanismos de composição e agregação . A diferença entre eles está no “rigor” dessas conexões. Vamos dar um exemplo simples: Temos o nosso Car- um carro. Todo carro tem um motor. Além disso, todo carro tem passageiros dentro. Qual é a diferença fundamental entre campos Engine enginee Passenger [] passengers? Se um carro tem um passageiro dentro А, isso não significa que não possa haver passageiros Bnele C. Um carro pode acomodar vários passageiros. Além disso, se todos os passageiros forem retirados do carro, ele continuará funcionando silenciosamente. A relação entre classe Care massa de passageiros Passenger [] passengersé menos rigorosa. É chamado de agregação . Existe um bom artigo sobre esse assunto: Relacionamentos entre classes (objetos) . Ele fornece outro bom exemplo de agregação. Digamos que temos uma turma Studentdenotando um aluno e uma turma StudentsGroup(um grupo de alunos). Um aluno pode ser membro de um clube de física, de um fã-clube de estudantes de Star Wars ou de uma equipe KVN. A composição é um tipo de comunicação mais estrito. Ao usar a composição, um objeto não apenas faz parte de algum objeto, mas também não pode pertencer a outro objeto do mesmo tipo. O exemplo mais simples é o motor de um carro. Um motor faz parte de um carro, mas não pode fazer parte de outro carro. Como você pode ver, a conexão deles é muito mais rígida do que a de Care Passengers. Relações entre classes.  Herança, composição e agregação - 4
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION