Escolar Documentos
Profissional Documentos
Cultura Documentos
objectos.
Classes e objetos
Marca;
Modelo;
Cor;
Placa;
E várias outras características…
Ligar;
Acelerar;
Desligar;
E várias outras ações…
// ...
Carro gol = new Carro();
gol.modelo = "Gol";
gol.marca = "Volkswagen";
gol.ligar();
gol.desligar();
linea.ligar();
linea.desligar();
Encapsulamento
public Carro() {
ligado = false;
}
public Carro() {
ligado = false;
}
public Carro() {
ligado = false;
}
public void ligar() {
ligado = true;
System.out.println("O veículo ligou!");
}
Isso certamente é uma situação problemática, pois agora nosso carro dá uma brecha para
funcionar de maneira diferente de como ele foi planejado.
public Carro() {
ligado = false;
}
Assim, o erro que víamos antes não acontecerá mais, pois o atributo ligado agora só é
acessível dentro da própria classe Carro.
public Carro() {
ligado = false;
}
Com o método acima, poderíamos pelo menos verificar externamente se o carro está
ligado ou desligado.
Herança
O reaproveitamento de código e a possibilidade de se evitar código duplicado
são objetivos das linguagens orientadas a objetos. Vamos imaginar que agora nós
precisamos criar uma classe para definir um outro tipo de veículo, como uma bicicleta.
Uma bicicleta possui atributos em comum com um carro: ambos possuem marca e
modelo, por exemplo. Além disso, ambos não deixam de ser um tipo de veículo.
Abstração
Quando estamos lidando com a orientação a objetos, é muito comum que nós
sempre tentemos escrever código baseado em abstrações, pois isso traz flexibilidade ao
código.
// Método abstrato: a classe Veiculo sabe que ela tem que acelerar,
mas não sabe como fazer isso.
// A responsabilidade passa a ser das classes-filha
public abstract void acelerar();
public Carro() {
ligado = false;
}
Com a utilização da abstração nesse caso, sabemos que qualquer novo tipo de veículo
que for criado a partir da classe Veiculo terá que obrigatoriamente implementar o
comportamento de aceleração. Isso faz muito sentido, já que todo veículo tem que ser
capaz de acelerar.
Polimorfismo
Linguagens orientadas a objetos ainda prevêem o suporte para criação de
estruturas polimórficas. Estruturas polimórficas são estruturas que conseguem mudar
seu comportamento interno em determinadas circunstâncias. Essa variação
comportamental pode acontecer por algumas formas, como através da sobescrita de
métodos e através do LSP (Liskov Substitution Principle).
No exemplo anterior, nós temos um exemplo de polimorfismo através da sobrescrita de
métodos: nós temos a classe Veiculo, que possui o método abstrato acelerar(). O método
é abstrato porque a classe Veiculo só sabe que tem que conter este comportamento, mas
não sabe como esse comportamento deve ocorrer.
Mas, as classes Carro e Bicicleta foram obrigadas a implementar o
método acelerar() por herdarem a classe Veiculo. Cada uma dessas classes implementou
o método acelerar() da maneira mais adequada para cada um dos tipos de veículos.
Aqui, já temos um exemplo de polimorfismo: as classes Carro e Bicicleta são
polimórficas, pois possuem um ancestral comum (a classe Veiculo) que as obriga a
implementar o método acelerar(), mas cada uma delas implementa o mesmo método da
maneira mais correta para cada tipo de veículo.
Essa mudança de implementação não exigiu a mudança do código da
classe Veiculo, além de que a implementação dos métodos acelerar() em cada uma das
classes é isolada: a implementação do método acelerar() na classe Carro não afeta a
implementação do mesmo método na classe Bicicleta, e vice-versa.
Outro exemplo de polimorfismo seria através da aplicação do Princípio da Substituição
de Liskov (também conhecido como LSP - Liskov Substitution Principle). O LSP é
parte de um conjunto de cinco práticas de codificação conhecido como SOLID. Estes
princípios visam a produção de código com alta qualidade e alinhado com os princípios
das linguagens orientadas a objeto.
Para entender o LSP, considere o código abaixo:
Neste exemplo, além de todas as vantagens que podemos notar no que diz
respeito à qualidade e manutenibilidade do código, podemos dizer que o
objeto veiculo é um objeto polimórfico, pois a concretização está sendo capaz de alterar
seu comportamento. Porém, todo o código subsequente não é afetado por essa troca.