Baixe o app para aproveitar ainda mais
Prévia do material em texto
Linguagem de Programação Classes Abstratas Classes Abstratas • Em algumas situações precisamos definir como uma classe deveria ser implementada. • Em outros casos, o modelo a ser representado é tão amplo, que certas classes se tornam gerais, não se tornando razoável que sejam implementadas ou até mesmo instanciadas.mesmo instanciadas. • O uso de classes abstratas é direcionado para a construção de classes que constituirão um modelo. Classes Abstratas • Uma classe abstrata precisar ser estendida por meio de herança. • A classe abstrata serve de ancestral comum para um conjunto de classes que poderão ser tratadas pelo polimorfismo. • O fato de ser abstrata não impede que não possa ter métodos implementados, deixando para subclassesmétodos implementados, deixando para subclasses implementações específicas. • Quando haja a possibilidade de reutilização de código, prefira classe abstrata • Se o código reaproveitado é muito pequeno, talvez seja mais interessante uma interface Classes Abstratas • Vejamos a implementação da interface IVeiculo e três classes que implementam esta interface. • As demais classes que implementam Iveiculo precisam implementar os 3 métodos. public interface IVeiculo { public int getQuantidadeDePneus(); public boolean isVeiculoDePasseio(); public int getPotencia();public int getPotencia(); } public class Carro implements IVeiculo { public int getQuantidadeDePneus() { return 4; } public boolean isVeiculoDePasseio() { return true; } public int getPotencia() { return 80; } } Classes Abstratas • Classes Moto e Caminhao. public class Moto implements IVeiculo { public int getQuantidadeDePneus() { return 2; } public boolean isVeiculoDePasseio() { return true; } public int getPotencia() { return 30; } public class Caminhao implements IVeiculo { public int getQuantidadeDePneus() { return 6; } public boolean isVeiculoDePasseio() { return false; } public int getPotencia() { return 130; } } } } Classes Abstratas • A classe Principal instância 3 objetos, um de cada classe utilizando como referência a interface. • Em seguida faz chamada de execução ao método “isVeiculoDePasseio”. public class Principal { public static void main(String[] args) { IVeiculo v1 = new Carro(); IVeiculo v2 = new Moto(); IVeiculo v3 = new Caminhao();IVeiculo v3 = new Caminhao(); System.out.println("Carro:"+(v1.isVeiculoDePasseio() ? "Veiculo de Passeio" :"Veiculo Carga")); System.out.println("Moto:"+(v2.isVeiculoDePasseio() ? "Veiculo de Passeio" :"Veiculo Carga")); System.out.println("Caminhao:"+(v3.isVeiculoDePasseio() ? "Veiculo de Passeio" :"Veiculo Carga")); } } Carro:Veiculo de Passeio Moto:Veiculo de Passeio Caminhao:Veiculo Carga Classes Abstratas • A classe abstrata Veículo irá implementar a interface IVeiculo, servindo como superclasse para as classes Carro, Moto e Caminhao. • A classe Veiculo não poderá ser instanciada por se tratar de abstrata, servindo apenas como modelo. • A classe Veiculo terá a implementação dos 3 método da interface. public abstract class Veiculo { public int getQuantidadeDePneus() { return 0; } public boolean isVeiculoDePasseio() { return true; } public int getPotencia() { return 0; } } Classes Abstratas • A implementação da classe Carro em vez de utilizar a interface IVeiculo estende a classe abstrata Veiculo. • A mesma alteração é processada nas classe Moto e Caminhao. public class Carro extends Veiculo { public int getQuantidadeDePneus() { return 4; } public boolean isVeiculoDePasseio() {public boolean isVeiculoDePasseio() { return true; } public int getPotencia() { return 80; } } • A execução da classe Principal terá como saída: Carro:Veiculo de Passeio Moto:Veiculo de Passeio Caminhao:Veiculo Carga Classes Abstratas • A classe Veiculo implementou o método isVeiculoDePasseio com return true, assim as classes Carro e Método não precisam implementar e nem sobre- escrever este método. • Apenas a classe Caminhao precisa sobre-escrevê-lo. public class Caminhao extends Veiculo { public int getQuantidadeDePneus() {public int getQuantidadeDePneus() { return 6; } public boolean isVeiculoDePasseio() { return false; } public int getPotencia() { return 130; } } Classes Abstratas • Por outro lado, a implementação do método getPotencia() está feita na classe abstrata Veiculo, o que permitiria, por exemplo, a classe Carro não implementar este método. • Ao se utilizar um objeto da classe Carro o retorno desse método seria inválido por retornar zero. • A alternativa é tornar o método getPotencia() abstrato para exigir as subclasses em implementá-lo. Assim a classe fica na forma abaixo.na forma abaixo. • O método abstrato não pode ter implementação, nem vazia. public abstract class Veiculo { public abstract int getQuantidadeDePneus(); public boolean isVeiculoDePasseio() { return true; } public abstract int getPotencia(); }
Compartilhar