6.3 Método abstrato
Se cada novo Livro terá uma estratégia de desconto diferente, ou seja, se não há um desconto padrão entre todos os tipos de livro, poderíamos simplesmente apagar esse método dessa classe abstrata e escrevê-lo apenas nas classes que devem ter desconto. O problema disso é que perderíamos o polimorfismo, afinal, seo método não estiver presente na tipo Livro, o seguinte código não funcionará:
public void adiciona(Livro livro) { System.out.println("Adicionando: " + livro); livro.aplicaDescontoDe(0.16);total += livro.getValor();
}
Nem todo Livro terá o método aplicaDescontoDe, não há nenhuma
garantia disso.
Podemos resolver o problema de uma forma mais efetiva. Toda classe abstrata, comoéo caso da nossa classe Livro, pode ter métodos abstratos. Toda classe filha (subclasse) concreta (não abstrata) é obrigada a escrever os métodos abstratos da classe pai (superclasse), caso contrário seu código não compilará.
Para tornar o método aplicaDescontoDe abstrato na classe Livro, basta adicionar o modificador abstract em sua declaração e remover todo o corpo, colocando apenas um ponto e vírgula. Repare:
public abstract class Livro {
java
private String nome; private String descricao; private double valor;
private String isbn; private Autor autor;
public Livro(Autor autor) { this.autor autor;
this.isbn "000-00-00000-00-0";
}
public abstract boolean aplicaDescontoDe(double porcentagem);
// outros metodos, getters e setters
}
Apenas classes abstratas podem ter métodos abstratos. Afinal, se al-
guém invocasse o método aplicaDescontoDe da classe Livro, qual seria o resultado? Não há nenhuma implementação nele, portanto ele não poderia ser executado.
A partir do momento em que tornamoso método aplicaDescontoDe abstrato, todas as classes filhas precisam escrevê-lo. Por esse motivo, a classe MiniLivro vai parar de compilar. O erro será:
The type MiniLivro must implement the inherited abstract method Livro.aplicaDescontoDe(double)
Para que tudo funcione a classe precisará ficar assim:
public class MiniLivro extends Livro {
java
public miniLivro(Autor autor) { super(autor);
}
java
@Override
java
public boolean aplicaDescontoDe(double porcentagem) { return false;
python