Posso ottenere una spiegazione chiara del perché perché non possiamo creare un'istanza di un oggetto di una classe astratta. So che l'astratto non è reale. Ma voglio sapere di più perché non possiamo istanziare un oggetto di una classe astratta.
È perché una classe astratta non è completa. Una o più parti della sua interfaccia pubblica non sono implementate. Hai detto cosa saranno - come sono chiamati, come si chiamano, cosa restituiscono - ma non è stata fornita alcuna implementazione, quindi nessuno sarebbe in grado di chiamarli.
I compilatori impediscono di creare istanze di tali oggetti incompleti sulla base del fatto che se si crea un'istanza di un oggetto si vorrà utilizzare la sua intera interfaccia pubblica (questa ipotesi è legata all'idea che un oggetto dovrebbe fare un insieme minimo di cose, in modo che l'interfaccia pubblica non sia troppo grande da gestire). È anche un'utile rete di sicurezza. Il compilatore dice "aspetta, questa è solo una parte di una classe, è necessario fornire il resto".
Supponiamo che il compilatore C # sia stato modificato per consentire l'istanziazione di classi astratte. Presumibilmente riempirebbe le definizioni mancanti con qualche codice stub. Essendo C #, sospetto che il codice getterebbe solo System.NotImplementedException
. Questo non è particolarmente utile, e anche un errore che non saresti in grado di trovare fino al runtime. Trovarlo in una fase di compilazione è molto più probabile che tu possa ottenere un programma che funzioni.
E questo non sta nemmeno pensando alla possibilità che uno dei metodi concreti forniti dalla classe astratta capiti di chiamare uno di quelli astratti che hai deciso di non dover scrivere.
Perché una classe astratta di design di solito ha un metodo non implementato. Cosa dovrebbe fare il programma se qualcuno provasse a chiamarlo?
Avere metodi non implementati su un oggetto è di solito un bug, quindi il compilatore ti aiuta non permettendo che esistano.
Se vuoi lanciare un errore quando viene chiamato il metodo, implementalo solo con throws new UnsupportedOperationException();
come implementazione.
Se non vuoi creare una nuova classe, puoi invece utilizzare una classe anonima:
AbstractFoo foo = new AbstractFoo(param, for, constructors){
@Override
public void foo(){
//override and implement methods
}
};
Ciò creerà una classe concreta dietro le quinte che saranno utilizzate.
Permettimi di rispondere alla tua domanda con un'altra domanda: che cosa accadrebbe quando chiami uno dei metodi astratti?
Leggi altre domande sui tag object-oriented java abstract-class