Sto facendo alcuni esercizi per diventare un pochino più pratico con le classi astratte e le interfacce visto che non ci ho capito molto e mi si è presentato questo esercizio:
Definire una opportuna gerarchia di classi che rappresenti contribuenti fiscali. La radice di tale gerarchia `e la classe pubblica astratta Contribuente, contenuta nel package contribuente, contenente i campi privati entrate e uscite di tipo double ed (unicamente) i seguenti metodi:
public Contribuente(double entrate, double uscite): crea un oggetto di classe Contribuente ed assegna a ciascun campo dati il valore del parametro omonimo;
abstract public String id(): restituisce l’identificativo del contribuente;
protected double imponibile(): restituisce l’ammontare dell’imponibile, calcolato secondo la formula imponibile = (entrate-uscite)*fds, dove fds rappresenta un fattore di sconto dipendente dal tipo di contribuente (v. sotto);
abstract protected double fattoreDiSconto(): restituisce il fattore di sconto del contribuente (valore compreso tra 0 ed 1);
abstract protected double aliquota(): restituisce l’aliquota del contribuente (valore com- preso tra 0 ed 1, estremi inclusi);
public double daPagare(): restituisce l’ammontare totale delle tasse da pagare, ovvero il prodotto dell’imponibile per l’aliquota.
package contribuente;
public abstract class Contribuente {
private double entrate;
private double uscite;
public Contribuente(double entrate, double uscite){
this.entrate = entrate;
this.uscite = uscite;
}
abstract public String id();
protected double imponibile(){
return (entrate - uscite)*fattoreDiSconto();
}
abstract protected double fattoreDiSconto();
abstract protected double aliquota();
public double daPagare(){
return imponibile() * aliquota();
}
}
Dopo aver realizzato tale classe, definire nel package contribuente.persone la classe pubblica PersonaFisica, implementazione di Contribuente, che rappresenta i contribuenti di tipo “persona fisica”, contenente un campo dati privato codiceFiscale di tipo String ed il costruttore a tre argo- menti public PersonaFisica(double entrate, double uscite, String codiceFiscale,String nome, String cognome) che crea un oggetto di classe PersonaFisica ed assegna a ciascun campo dati il valore del parametro omonimo.
E qui ho i primi dubbi. Dice implementazione, ma non sono solamente le interfacce che si possono implementare? Anche se faccio una classe con extends Contribuente comunque deve rimanere astratta. Quindi a che serve fare delle classi astratte se poi alla fine le derivate sempre astratte possono essere e quindi è impossibile implementarle? Avete qualche risorsa dove posso leggere l'utilità delle classi astratte e interfacce? All'università il professore non ne ha proprio parlato e quindi anche se mi sembra una cosa per mantenere tutto in ordine e strutturato non ne vedo l'utilità. PS potete controllare anche se ho scritto bene la classe precedente?