PDA

View Full Version : [Java]Abstract help


Pro7on
06-03-2007, 16:04
Ciao a tutti, c'è qualche duno che a la pazienza di spiegarmi velocemente come funziona una classe astratta... tipo:


Classe astratta Veicoli e classi moto auto che si estendono giusto??'

tipo che voglio avere una classe garage che mi fa vedere che auto ho che moto (tramite arraylist)?:help: Thx

andbin
06-03-2007, 17:01
Ciao a tutti, c'è qualche duno che a la pazienza di spiegarmi velocemente come funziona una classe astratta...Facciamo qualche premessa: la parola chiave 'abstract' può essere applicata alle classi e ai metodi di istanza.
Una classe può avere sia metodi astratti che non astratti ma se c'è almeno 1 metodo marcato abstract, allora anche la classe deve essere marcata abstract.
Una classe marcata abstract è una classe che non può essere istanziata e che deve essere estesa da una sottoclasse per poter essere usata. Una classe che estende una classe astratta può a sua volta essere astratta. L'importante è che la prima sotto-classe "concreta" (non astratta) implementi tutti i metodi astratti.

tipo:

Classe astratta Veicoli e classi moto auto che si estendono giusto??'

tipo che voglio avere una classe garage che mi fa vedere che auto ho che moto (tramite arraylist)?:help: ThxEcco un esempio che ho buttato giù (nota, per Java 5 o superiore):
import java.util.*;

public class Garage implements Iterable<Veicolo>
{
private ArrayList<Veicolo> veicoli;

public Garage ()
{
veicoli = new ArrayList<Veicolo> ();
}

public void add (Veicolo veicolo)
{
veicoli.add (veicolo);
}

public Iterator<Veicolo> iterator ()
{
return veicoli.iterator ();
}

public static void main (String[] args)
{
Garage g = new Garage ();

g.add (new Auto ("Toyota XYZ", false));
g.add (new Moto ("Yahama MNO", true));
g.add (new Auto ("Suzuki FGH", true));

for (Veicolo v: g)
{
System.out.println (v);
}
}
}


abstract class Veicolo
{
private String modello;

public Veicolo (String modello)
{
this.modello = modello;
}

public final String getModello ()
{
return modello;
}

public String toString ()
{
return modello;
}
}

class Auto extends Veicolo
{
private boolean trazioneIntegrale;

public Auto (String modello, boolean trazioneIntegrale)
{
super (modello);
this.trazioneIntegrale = trazioneIntegrale;
}

public boolean isTrazioneIntegrale ()
{
return trazioneIntegrale;
}

public String toString ()
{
return super.toString () + (trazioneIntegrale ? ", con trazione integrale" : "");
}
}

class Moto extends Veicolo
{
private boolean duePosti;

public Moto (String modello, boolean duePosti)
{
super (modello);
this.duePosti = duePosti;
}

public boolean isDuePosti ()
{
return duePosti;
}

public String toString ()
{
return super.toString () + (duePosti ? ", due posti" : "");
}
}

Pro7on
07-03-2007, 07:39
;) :D Thx ....


mi spieghi solo cosè quel


Iterable??? e xche metti quei caratteri "<" & ">"??

andbin
07-03-2007, 08:37
Iterable???Lo spiega bene qui: java.lang.Iterable (http://java.sun.com/javase/6/docs/api/java/lang/Iterable.html).
"Implementing this interface allows an object to be the target of the "foreach" statement."

e xche metti quei caratteri "<" & ">"??Sono i "generics", vedi il tutorial (http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf).

Pro7on
07-03-2007, 12:34
e nn ho capito molto, nn c'è un modo senza usare iIterable e <> ?

poi ho una domanda...

la classe moto passa i dati a veicoli e alla fine abbiamo dei dati adesso in teoria dobbiamo mettere questi dati nel'arraylist ecco la domanda e questa: devo prima add in un oggetto giusto?

nel senso ho alla fine es 3 var "auto1 porche 22cavalli" devo unirle per metterle nel array list magazzinoGarage?

andbin
07-03-2007, 14:09
e nn ho capito molto, nn c'è un modo senza usare iIterable e <> ?I generics e il for-each sono caratteristiche introdotte con Java 5, se non vuoi/puoi usarle non ci sono grossi problemi!

Togliendo generics e for-each, la parte iniziale del mio esempio sarebbe:
import java.util.*;

public class Garage
{
private ArrayList veicoli;

public Garage ()
{
veicoli = new ArrayList ();
}

public void add (Veicolo veicolo)
{
veicoli.add (veicolo);
}

public Iterator iterator ()
{
return veicoli.iterator ();
}

public static void main (String[] args)
{
Garage g = new Garage ();

g.add (new Auto ("Toyota XYZ", false));
g.add (new Moto ("Yahama MNO", true));
g.add (new Auto ("Suzuki FGH", true));

for (Iterator i = g.iterator(); i.hasNext (); )
{
System.out.println (i.next ());
}
}
}Come vedi non cambia molto. Il metodo iterator() c'è comunque perché l'arraylist 'veicoli' è private, quindi devo avere un qualche modo per fare una scansione dell'arraylist. Il fatto è che senza il for-each è il programmatore che deve prendere l'iteratore e scansionarlo "a mano".

Se non si vuole nemmeno usare un iteratore, ci sarebbe la classica maniera del size() e get(index). Visto che 'veicoli' è private, metto nella classe Garage dei metodi size() e get() che chiamano gli omonimi metodi in ArrayList. A quel punto si fa il classico for da i=0 per i < size().

Comunque se hai tempo e voglia approfondisci i generics e il for-each, che sono molto comodi (Java 5 comunque ha portato anche molte altre novità!).

poi ho una domanda...

la classe moto passa i dati a veicoli e alla fine abbiamo dei dati adesso in teoria dobbiamo mettere questi dati nel'arraylist ecco la domanda e questa: devo prima add in un oggetto giusto?

nel senso ho alla fine es 3 var "auto1 porche 22cavalli" devo unirle per metterle nel array list magazzinoGarage?Non ho ben capito cosa non ti è chiaro. Nel mio esempio ho fatto:

g.add (new Auto ("Toyota XYZ", false));

Cioè ho creato un oggetto di tipo Auto e l'ho aggiunto al volo nell'ArrayList attraverso il metodo add (che richiama poi add in ArrayList).