Buscar

20 - Classes Abstratas

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();
}

Continue navegando