Sto cercando di capire la differenza tra una classe astratta ed un'interfaccia
con degli esempi pratici dato che dal capitolo del mio libro di testo non riesco a cogliere la questione. Per ora ho capito questo:
Una classe astratta può essere “
estesa” mentre un’interfaccia può essere “
implementata”.
SIGNIFICATO DI ESTENDERE
Estendere significa poter ridefinire una data astrazione (ovvero la classe astratta) con una nuova classe x (x è inteso come nome generico di una classe). E’ possibile ridefinire un’astrazione per volta ovvero non si possono ridefinire più astrazioni nella stessa nuova classe x.
SIGNIFICATO DI IMPLEMENTARE
Implementare significa poter ridefinire una data astrazione (ovvero l’interfaccia) con una nuova classe x (x è inteso come nome generico di una classe). E’ possibile ridefinire più di un’astrazione per volta ovvero si possono ridefinire più astrazioni nella stessa nuova classe x.
Esempio 1 – QUI SI ESTENDE
abstract class Area {abstract void area(int A);}
abstract class Perimetro {abstract void perimetro(int P);}
class CDG extends Area {
void area(int A){System.out.println("L'Area vale: "+A);}
}
class CDGb extends Area {
void area(int A){System.out.println("Il doppio dell'Area vale: "+2*A);}
}
class CDG2 extends Perimetro {
void perimetro(int P){System.out.println("Il perimetro vale: "+P);}
}
class CDG2b extends Perimetro {
void perimetro(int P){System.out.println("Il doppio del perimetro vale: "+2*P);}
}
class Esempio2{
public static void main(String args[]){
CDG cdg = new CDG();
CDG2 cdg2 = new CDG2();
cdg.area(4);
cdg2.perimetro(5);
CDGb cdgb = new CDGb();
CDG2b cdg2b = new CDG2b();
cdgb.area(4);
cdg2b.perimetro(5);
}
}
Esempio 2 – QUI SI IMPLEMENTA
interface Area {void area(int A);}
interface Perimetro {void perimetro(int P);}
class CDG implements Area, Perimetro {
public void area(int A){System.out.println("L'Area vale: "+A);}
public void perimetro(int P){System.out.println("Il perimetro vale: "+P);}
}
class AltroCDG implements Area, Perimetro {
public void area(int A){System.out.println("Il doppio dell'area vale: "+2*A);}
public void perimetro(int P){System.out.println("Il doppio del perimetro vale: "+2*P);}
}
class Esempio{
public static void main(String args[]){
CDG cdg = new CDG();
AltroCDG cdg2 = new AltroCDG();
cdg.area(4);
cdg.perimetro(5);
cdg2.area(4);
cdg2.perimetro(5);
}
}
Un amico mi ha detto che però questa non è l'unica differenza ma ce ne un'altra che dal mio codice non si coglie, che con le interfacce si può fare e con le classi astratte no. Potreste darmi una piccola mano? Ho già letto tutorial su internet, altre discussioni sul tema ma non riesco ad uscirne in nessun modo.