Beh, per cominciare potremmo passare alle classi abstract.
Una classe è dichiarata abstract quando al suo interno vi sono dei metodi che non possono, a priori, essere implementati, per scarsità di informazioni. L'esempio della Figura, che torna sempre fuori, è abbastanza intuitivo: non posso implementare il metodo calcola() per calcolare l'area di una figura, se non so di che figura si tratta. Però ho certamente bisogno di raggruppare Triangoli, Cerchi, Trapezi e così via sotto una grande famiglia che li accomuna. Nasce così la classe Figura che di per se non fornisce molte informazioni, però è la base per tutte le altre figure. Di solito ci si crea una gerarchia di ereditarietà, ossia c'è una classe che fa da capostipite dalla quale discendono le classi figlie.
Di solito (ma questo non è vero in generale) le classi abstract risiedono alle origini della gerarchia, e non sono mai (o quasi, perchè non avrebbe senso) il punto di arrivo della gerarchia.
Le classi abstract non possono, quindi, essere istanziate. Questo significa che non si può richiamare un costruttore per tali classi attraverso l'operatore new ed il motivo è abbastanza semplice da capire: sono classi che forniscono meno informazioni di quante ne siano richieste per creare un oggetto... immaginiamo di voler istanziare una figura, la prima domanda che sorge è "Che figura?": servono, quindi, ulteriori e più specifiche informazioni, che le classi abstract delegano alle figlie.
Spero di essere stato sufficientemente chiaro nella spiegazione.
Ciao.![]()