Post by AngelaPost by GiamboPost by AngelaHo visto che le classi astratte non possono essere istanziate, quindi
non è possibile creare oggetti. Me se nel mio programma ho bisogno di
accedere ad uno dei metodi di questa classe come faccio?
Dichiara una classe che estenda quella astratta (MyClass extends
MyAbstractClass). Quindi istanziala e usane i metodi.
Ma c'è solo questa strada da intraprendere? Perchè ho impressione che
le classi che hanno questto difetto sono molte e diventa molto
dispendioso farlo per tutte... A meno che non le richiamo dal main (che
è statico)... boh!
C'è essenzialmente *solo questa* strada da intraprendere, anche se
con alcune varianti: non si tratta comunque di un difetto, la creazione
di classe astratte dovrebbe anzi facilitare l'organizzazione della
struttura ad oggetti del programma nel suo complesso.
Vado ad esemplificare:
public abstract class A {
public void a1() {
//...
}
public abstract void a2();
public static void a3() {
//...
}
}
Trattasi di una classe astratta A che implementa un metodo "normale"
a1() ed un metodo statico a3() e dichiara un metodo astratto a2().
Dall'esterno (main() oppure altra classe non correlata) posso
richiamare solo il metodo statico: A.a3() , mentre non posso
richiamare i metodi non statici perchè mi servirebbe un'istanza
della classe A che, di per sè, non è istanziabile:
new A() -> errore
A questo punto se ho una classe:
public class B extends A {
public abstract void a2() {
//...
}
}
che per forza di cose implementa il metodo a2() lasciato "incompleto"
altrimenti avrebbe dovuto venir dichiarata anch'essa astratta,
posso tranquillamente dall'esterno scrivere il seguente codice:
b = new B();
b.a1();
b.a2();
b.a3();
B.a3();
A.a3();
In realtà avrei anche potuto scrivere fin dall'inizio:
(new A() {
public abstract void a2() {
//...
}
}).a1();
dove, però, non sto istanziando direttamente un oggetto della classe A
ma sto definendo al volo una classe senza nome che estende la classe
A, ricavando un'istanza di questa ed usandola per richiamare il metodo
non statico a1().
Un utilizzo reale di quanto qui sopra illustrato avviene, per esempio,
solitamente con i Listener degli eventi, anche se lì si tratta di
interfacce.
Dimmi se è chiaro.