Ciao LeleFT, senza voler abusare della tua disponibilità avrei da chiederti delle delucidazioni in merito all'esempio della Figura che tu hai fatto in un post presente in questa discussione. Io per esercitarmi ho preso spunto dalle tue indicazioni e mi sono creato il codice sottostante con il fine di prendere confidenza con questi concetti:
Dopo aver verificato la correttezza di quanto da me fatto, ti pongo le seguenti domande in riguardo a cose che mi hanno lasciato dei dubbi riguardo al codice che proponevi tu nel suddetto post:codice:abstract class Figura { abstract double calcola(); } class Triangolo extends Figura { int base, altezza; Triangolo(int a, int b) { this.altezza = a; this.base = b; } public double calcola() { return ((base*altezza)/2); } } class Quadrato extends Figura { int lato; Quadrato(int l) { this.lato = l; } public double calcola() { return (lato*lato); } } class Cerchio extends Figura { int raggio; Cerchio(int r) { this.raggio = r; } public double calcola() { return (raggio*raggio*Math.PI); } } public class Aree { public static void main(String args[]) { // Triangolo T = new Triangolo(3,6); // Quadrato Q = new Quadrato(5); // Cerchio C = new Cerchio(10); Figura T = new Triangolo(3,6); Figura Q = new Quadrato(5); Figura C = new Cerchio(10); System.out.println("Area Triangolo: "); CalcolaArea(T); System.out.println("Area Quadrato: "); CalcolaArea(Q); System.out.println("Area Cerchio: "); CalcolaArea(C); } public static void CalcolaArea(Figura F) { System.out.println(F.calcola()); } } Quindi l'esecuzione: C:\java_source>javac Aree.java C:\java_source>java Aree Area Triangolo: 9.0 Area Quadrato: 25.0 Area Cerchio: 314.1592653589793 C:\java_source>
1) Perchè dichiari come "public" la classe astratta "Figura" e le sottoclassi che la estendono come "Triangolo", "Quadrato" e "Cerchio"? Intendo sapere se c'è un motivo che può indurre alla dichiarazione "public" rispetto a come ho fatto io e se la soluzione da me adottata può non andar bene per qualche motivo.
2) Inoltre la dichiarazione di queste classi come "public" comporta che esse devono essere memorizzate in file separati del tipo Triangolo.java, Quadrato.Java e Cerchio.java... o mi sbaglio? Io per adesso ho sempre memorizzato tutte le classi nel solito file che compilo ed eseguo con i comandi "javac" e "java".
3) Ho letto che un metodo di tipo astratto dichiarato in una classe abstract deve essere sempre dichiarato abstract anch'esso. Perchè tu non dichiari come abstract il metodo calcola?
4) Nel metodo main ho riportato due modi, entrambi provati, di istanziare gli oggetti: quello commentato è del tipo indicato da te, mentre quello attualmente utilizzato richiama per certi versi una questione trattata all'inizio della discussione riguardo il dispatch. Entrambi funzionano e danno il risultato atteso: mi chiedo quindi quale sia la differenza e con quale criterio scegliere un modo o l'altro?
Se con calma puoi rispondere a questi quesiti può essere che risulti utile anche ad altri utenti del forum, poichè vedo che questi temi per i principianti sono difficili da capire.
Mille grazie!

Rispondi quotando