Newsgroup: it.comp.java
Titolo: Gerarchia multilivello e occultameto di variabile.

Salve a tutti, forse il problema che posto può sembrare un pò stupido e 
irrilevante in ogni caso non fa niente!
é noto che in java e con qualsiasi linguaggio orientato agli oggetti 
supporta dei meccanismi per implementare l'ereditarità.
Sono alle prime armi con java e mi è sorto un dubbio quando creo una 
gerarchia di classi multilivello.
Nel mio caso di esempio ho tre classi chiamate A, B e C, dove C è una 
sottoclasse di B,che a sua volta è una sottoclasse di A.
In questa situazione ogni sottoclasse eredita le caratteristiche di tutte le 
sue superclassi(e fin qui ci siamo).
La classe A ha una variabile di istanza chiamata a, i membri della classe B 
sono a , b(Quindi a viene occultata e si può far riferimento ad essa tramite 
super),poi la classe C ha come variabili di istanza a,b,c (a e b vengono di 
nuovo occultate).
MI CHIEDO COME SIA POSSIBILE DALLA CLASSE C FARE RIFERIMENTO DIRETTO ALLA 
VARIABILE DI ISTANZA a DICHIARATA NELLA CLASSE A!
Se qualcuno ha la risposta la posti gentilmente
ecco il codice sul quale faccio esempio:
class A {
   int a;
   public A(){
     System.out.println("Costruttore di A");
   }
   public A(int aA) {
     this.a = aA;
   }
  void stampaA() {
    System.out.println("Valore di a in A" + a);
  }
}
class B extends A {
   int a;//Sovrascrive la a in A
   int b;
   public B (){
     System.out.println("Costruttore di B");
   }
   public B (int aA, int aB, int bB) {
     super(aA);
     this.a = aB;
     this.b = bB;
   }
  void stampaB() {
    System.out.println("Valore di a in A" + super.a);//Posso far riferimeto 
alla a di A
    System.out.println("Valore di a in B" + a);//Variabile di istanza locale
    System.out.println("Valore di b in B" + b);//Variabile di istanza locale
  }
}
class C extends B {
  int a,b,c;//Sovracrivo a e b
  public C (int aA,int aB, int bB,int aC,int bC,int cC ) {
    super(aA,aB,bB);//Inizzializzo a di A ,a di B, e b di B
    this.a = aC;//Inizzializzo variabili di istanza locali
    this.b = bC;
    this.c = cC;
  }
  void stampaC() {
    //COME FACCIO IN QUESTO PUNTO DEL CODICE A RAGGIUNGERE
    //LA VARIABILE DI ISTANZA a dichiarata nella classe A ?
    //Con l'espressione super.a al massimo posso risalire alla gerarchia 
superiore (ovvero B)
    System.out.println("Valore di a in B  " + super.a);
    System.out.println("Valore di b in B  " + super.b);
    System.out.println("Valore di a in C  " + a);
    System.out.println("Valore di b in C  " + b);
    System.out.println("Valore di c in C  " + c);
  }
}
public class TestEredita {
  public static void main(String[] args) {
    C objC = new  C(1,2,3,4,5,6);
    objC.stampaC();
  }
}
Il programma compilato stampa a video:
Valore di a in B  2
Valore di b in B  3
Valore di a in C  4
Valore di b in C  5
Valore di c in C  6
Vorrei poter accedere alla varibile ereditata a della classe A 
direttamente(senza creare alcun oggetto della classe B) nel metodo 
stampaC(). 

     System.out.println("Valore di b in B  " + super.b);
Non mi sono mai trovato in questa situazione ma provo a dare un
suggerimento banale:
super.super.a ?
Mi permetto comunque di osservare che il punto del "masking" è di occultare
e quindi usare espressamente la variabile ridefinita localmente. Se hai
necessità di accedere a variabili della classe super anche se ridefinite
localmente, forse andrebbe rivisto il design.
Alex.
-- 
___________________________________________________________
a p bertolini
(Tribù Digitale Blackmambo: 
www.blackmambo.it
)


Grazie Alex per la tua risposta, super.super.a è un errore di sintassi.
IL design è stato fatto apposta cosi, per studiare fino a che livello di 
gerarchia potevo risalire occultando una variabile di istanza.
Fino ad ora ho concluso che la varibile a di A in quel punto di codice non è 
accessibile  DIRETTAMENTE(e tengo a sottolineare questa cosa) dalla 
sotto-sotto-classe(scusate il termine)se entrambe le classi che essa eredita 
(mi riferisco alla classe C) ridefiniscono la stessa variabile di istanza(la 
nostra in questione era la a in A).
La domanda implicita che mi pongo è:
allora devo fornire necessariamente dei metodi nella super super classe(La 
classe A), che mi forniscono il valore di a?o al limite li devo fornire 
nella classe B...

 nella classe B...
ma scusa, ti serve risolvere sto problema, o e' una pippa mentale ?
Nicola
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


 è una situazione che potrebbe verificarsi,è utile sapere come il linguaggio 
implementa  l'incapsulamento, o i meccanismi di privatezza che legano il 
codice ai dati.
Come vedo cmq non sai dare una risposta sicura alla domanda....
Ah le pippe fanno male... 

 Ah le pippe fanno male...
Non volevo essere offensivo, sorry


 VARIABILE DI ISTANZA a DICHIARATA NELLA CLASSE A!
Ti servono dei metodi per far questo.
-- 
Domenico Loiacono -  Java Architect & Developer
SWORD ICT srl
Email: loiacono at sword dot it


Ciao credo che questo codice possa fare al caso tuo
Eseguilo e vedrai che funziona
Ciao
public class A{
	public String a;
 
	public A(){
		System.out.println("Sono il costruttore di A");
 
		this.a = "Somo la a di A";
	}
}
 public class B extends A{
	public String a, b;
 
	public B(){
		System.out.println("Sono il costruttore di B");
 
		this.a = "Sono la a di B";
		this.b = "Sono la b di B";
	}
}
public class C extends B{
	public String a, b, c;
 
	public C(){
		System.out.println("Sono il costruttore di C");
 
		a = "Sono la a di C";
		b = "Sono la b di C";
		c = "Sono la c di C";
	}
}
public class ClassMain{
	public static void main(String args[]){
		C c = new C();
		B b = (B)c;
		A a = (A)c;
 
		System.out.println("=============Proprietà di C===============");
		System.out.println(c.a);
		System.out.println(c.b);
		System.out.println(c.c);
		System.out.println("=============Proprietà di B===============");
		System.out.println(b.a);
		System.out.println(b.b);
		System.out.println("=============Proprietà di A===============");
		System.out.println(a.a);


 ha scritto:

Ciao, credo che questo codice possa fare al caso tuo, eseguilo e vedrai.
Se vuoi dei chiarimenti sono qua'


 Ah le pippe fanno male...
Mi permetto...qualche nota...senza polemiche...
Nel tuo primo post hai affermato di essere alle prime armi
con Java. Non so se sei un neofita anche della programmazione
ad oggetti in generale, ma in ogni caso e' errore comune
di chi inizia cercare di abusare dell'ereditarieta' (complice
molta scadente letteratura...)
In secondo luogo, ho seri dubbi che, in un design ad oggetti
di un'applicazione reale ci si possa imbattere in una situazione
come quella che hai descritto, in quanto si tratterebbe 
quasi sicuramente di cattiva progettazione.
In ogni caso, se la tua curiosita' e' puramente "accademica", 
la risposta e'...che si tratta di un problema di design... ;)
A parte gli scherzi, credo che, in un buon design ad oggetti, 
si debbano esporre servizi e non dati, ANCHE alle eventuali 
classi derivate.
Nel tuo caso, la classe A dovrebbe dichiarare appositi metodi
(magari protetti) per l'accesso all'attributo a.
Rimane comunque "sospetto" il fatto che A esponga un dato
anziche' un servizio...
Per concludere, e' meglio sfatare fin da subito la leggenda che
usando un linguaggio ad oggetti si possa sempre usare la
ereditarieta' per derivare nuove classi da quelle esistenti
per modificarne solo alcuni comportamenti ereditando tutti 
gli altri! L'ereditarieta' richiede un'accurata progettazione
delle gerarchie per poter essere effettivamene utilizzata
nella pratica.
Il possedere una ferrari non significa necessariamente
saperla (o poterla!) guidare... ;)
Saluti
Roberto
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it