Newsgroup: it.comp.java
Titolo: Problema con ereditarietà... CREDO...(un po' lungo)

Ciao a tutti,
non sono molto esperta in Java e ho il seguente problema...
ho una classe skiPassGiornaliero e un'altra classe skiPassSettimanale che 
estende la prima,
quindi un oggetto skiPassSettimanale è un oggetto skiPassGiornaliero con 
qualche specifica in più, ma non viceversa!!!
public class SkiPassGiornaliero {
private String nome;
private static int counter = 0;
private int code;
public SkiPassGiornaliero(String nome){
 this.nome = nome;
 code = counter++;
}
public String getName(){
 return nome;
}
public int getCode(){
 return code;
}
public String getType(){
 return "giornaliero";
}
public String toString (){
 return nome+", "+getType();
}
}
______________________________________________
public class SkiPassSettimanale extends SkiPassGiornaliero {
private int vetPiste[];
private int indxPiste;
public SkiPassSettimanale (String nome){
 super(nome);
 vetPiste = new int [100];
 indxPiste = 0;
}
public String getType(){
 return "settimanale";
}
public void memorizzaPista(int codicePista) throws SciException{
 if (indxPiste>=vetPiste.length) throw new SciException("troppi piste 
discese");
 vetPiste[indxPiste++] = codicePista;
}
public boolean percorsaPista(int codicePista){  // controllo se ho percorso 
una certa pista
 int i;
 i = 0;
 while ((i<indxPiste)&&(vetPiste[i] != codicePista)) i++;
 return (i!=indxPiste);
}
}
__________________________________________________________________________
Sto scrivendo un'altra classe in cui ho definito vetPass come un vettore di 
skiPassGiornalieri,
 private SkiPassGiornaliero vetPass[];
ma in questo vettore inserisco sia oggetti  skiPassGiornalieri che 
skiPassSettimanali a seconda delle necessità, il mio problema è che sto 
cercando di definire un metodo "discesa" , in cui devo ricercare un 
particolare oggetto (un oggetto skiPassSettimanale) nel vettore vetPass e 
poi utilizzare un metodo specifico della classe skiPassSettimanale (sia 
memorizzaPista che con Percorsa pista) e il compilatore mi da errore...
mi dice << cannot fins symbol method percorsaPista(int)>> e <<cannot fins 
symbol method memorizzaPista(int)>>
io penso sia un problema derivato dall'ereditarietà e del fatto che sto 
lavorando su un vettore di skiPassGiornalieri e chiamo un metodo di una 
classe skiPassSettimanale, ma in veritàsto lavorando su di un oggetto 
skiPassSettimanale....
Spero di essermi spiegata in qualche modo....
chi mi può dare qualche suggerimento?
Grazie,
Laura
PS. non ho inserito il resto del codice e le altre classi per non far 
diventare il messaggio eterno ma ve lo posso passare basta che scriviate a 
ladolcela...@hotmail.it

 skiPassSettimanali a seconda delle necessità, il mio problema è che sto 
Il problema dovrebbe essere il fatto che per lui (il compilatore) 
vetPass contiene oggetti SkiPassGiornaliero per cui non puoi usare 
metodi che non siano di questa classe... se sei sicura che l'oggetto 
vetPass[i] sia SkiPassSettimanale puoi fare così
SkiPassSettimanale pass= (SkiPassSettimanale)vetPass[i];
dopodiché hai un oggetto (pass) del tipo corretto. Attenzione che se 
vetPass[i] non è del tipo giusto a runtime avrai l'eccezione 
ClassCastException.
bye
DKano

 ha scritto nel messaggio 
news:X%pHd.91546$C94....@tornado.fastwebnet.it...


 estende la prima,
Ciao, mi fermo qui.
Mi pare ci sia già un errore di progettazione. Stai violando uno dei 
principi della programamzione OO: un oggetto derivato dovrebbe 
rispettare la clausola "is a" (è un), ovvero secondo il tuo codice uno 
skipass settimanale è (anche) uno skipass giornaliero, il che è 
ovviamente errato e può portare a problemi come quelli da te descritti.
Tant'è vero che per evitare confusioni ricorri al metodo getType() che 
devi per forza sovrascrivere in ogni sottoclasse.
In realtà sarebbe forse meglio avere una classe SkiPass con i metodi 
comuni, da cui poi derivare SkiPassGiornaliero e SkiPassSettimanale 
(magari meglio DailySkiPass e WeeklySkiPass :-))
HTH
-- 
_ _ _  _  /_
  _ /_//_///_' ___
   / and yet it does move...

 skiPassSettimanale....
Certo, il downcasting (da una classe più generale ad una derivata) deve
essere esplicito.
Quindi
if(vetPass[i] instanceOf SkiPassSettimanale) {
SkiPassSettimanale set = (SkiPassSettimanale)vetPass[i];
//e qui fai quello che devi con il riferimento giusto
}
Ciao
-- 
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it/imsv/

 una specie di cast esplicito insomma...
Yep; di solito per usare metodi di una classe 'figlia' specifica faccio 
così. Credo che con la 1.5 ci siano anche altre possibilità (generics?) 
ma non ho ancora sperimentato nulla della 1.5.
bye
DKano

Non sono esperto né di java né di progettazione OO (prendi con le molle
ciò che ti suggerisco).
Mi sembra che in questo caso possa essere utile definire un'interfaccia
skiPass che venga implementata da tutte le classi ski pass (orario,
mattutino, pomeridiano, week-end, settimanale, stagionale ecc.).
In questo caso, facendo riferimento all'interfaccia dovresti poter evitare
il casting degli oggetti.
P.s.: Mi offro per il testing dell'applicazione, basta che mi offri
alloggio, vitto, ed un'istanza reale della classe skyPassSettimanale (lo
snowboard me lo porto io).
Ciao. 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it