Newsgroup: it.comp.java
Titolo: Mi vergogno della domanda..

 Tel.
(+39)-0587-749206
  Fax.
(+39)-0587-749206
  WEB: 
http://www.classx.it
  <
============================================================================

 }
Corretto visto che seti fa un this.i = x (ossia istanza_di_a.i = x), ed i è
membro privato di a. D'accordo che tu richiami il metodo su una istanza di b, ma
il metodo, richiamato nella superclasse di b, trova una variabile i privata e la
modifica. Dovresti mettere un seti anche a b, oppure dichiarare i protected (e
quindi b lo eredita, e lo può modificare). Ti ho incasinato?
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------



La domanda non è sciocca come credi...

Il risolutore di scope considera le due variabili "i" delle due classi
totalmente differenti e quando nella superclasse "a" in seti() fai i=valore
quello traduce qulla "i" in a.i.

Quindi quando nella classe b ridefinisci la variabile locali "i" questa
assume un valore totalmente differente ovvero quello di 
b.i
 che
è una variabile totalmente differente di 
a.i. 
Questo non
è un bug o un malfunzionamento bensì una feature. Infatti
pensa in caso in cui utilizzassi la classe di qualcun'altro e la estendi
e per disgrazia dichiari una variabile privata locale come quella della
superclasse quanti casini ti potrebbero capitare.

Ad esempio mettiamo il caso il cui la classe JText delle Swing abbia
una variabile privata di nome _text e i metodi getText() e setText() come
di seguito

class JText


{


    ...


    private String _text    = null;


    ...


    public String getText()


    { return _text; }


    public void setText( String aText )


    { _text = aText; }


    ...


}


Mettiamo ora che tu estenda questo componente per crearne uno nuovo
che magari abbia un testo di default che alla pressione di un determinato
tasto compaia il testo selezionato.


Tu ignaro del fatto che nell classe JText esista una variabile
di nome _text ne inserisci un'altra nella downclass come di seguito:


class DefaultText extends JText


{


    ...


    
private String _text    =
null;


    ...


    
// due metodi per leggere e inserire un
nuovo valore


    public String getDefaultText()


    { return _text; }


    public void setDefaultText( String aText )


    { _text = aText; }


    ...


}


Se Java funzionasse come ti aspettavi tu ci sarebbero dei grossi
casini sulla gran parte dei programmi. Per fortuna il linguaggio distinge
le due variabili ed anche se i methodi ereditati apparentemente fanno riferimento
ad una variabile privata locale questi in rialta' si riferiscono alla superclasse.


 

Per ottenere l'effetto da te desiderato prova a dichiarare i 
protect.

In questo modo la possono vedere solo le ereditate ma non classi esterne
e seti() funziona.


bye


Bruno


Prova questo codice






class a


{


 public a(){}


 
protected
 int i = 100;


 public int geti() {return i;}


 public void seti(int i) {this.i = i;}


}


class b extends a


{


 public b()


 { 
i = 200;
 }


 // inutile perché ereditato....


 //public int geti() {return i;}


}


public class c


{


 public static void main(String args[])


 {


  a a = new a();


  b b = new b();


  System.out.println("a.i = " + a.geti());


  System.out.println("b.i = " + b.geti());


  b.seti(1);


  System.out.println("cambio b.i");


  System.out.println("a.i = " + a.geti());


  System.out.println("b.i = " + b.geti());


 }


}





 

Corretto visto che seti fa un 
this.i = x
 (ossia istanza_di_a.i
= x), ed i è

membro privato di a. D'accordo che tu richiami il metodo su una istanza
di b, ma

il metodo, richiamato nella superclasse di b, trova una variabile i
privata e la

modifica. Dovresti mettere un seti anche a b, oppure dichiarare i protected
(e

quindi b lo eredita, e lo può modificare). Ti ho incasinato?

 

purtroppo non solo il 
this
. Questo dipende dal fatto che è

private
. Prova nel suo programma a togliere 
this
 in questo
modo

 class a

 {

  public a(){}

  private int i = 100;

  public int geti() {return i;}

  public void seti(int x) {i = x;}


 }

otterrai LO STESSO RISULTATO. Giusta la nota sul 
protected
.

bye

//Bruno



 ha scritto nel messaggio
news:38FAD634...@wuerth.it...
La domanda non č sciocca come credi...
Il risolutore di scope considera le due variabili "i" delle due classi
totalmente differenti e quando nella superclasse "a" in seti() fai i=valore
quello traduce qulla "i" in a.i.
Quindi quando nella classe b ridefinisci la variabile locali "i" questa
assume un valore totalmente differente ovvero quello di b.i che č una
variabile totalmente differente di a.i. Questo non č un bug o un
malfunzionamento bensě una feature. ...

[...]
Perche' l'Ereditarieta' per il Puro Riuso di Codice E' Male. :)
Quando disegni un modello, i tuoi membri inizialmente sono o pubblici o 
privati. Poi, durante il refactoring e l'evoluzione del disegno, alcun 
diventano protected quando generalizzi ed "estrai la struttura".
Una volta "chiusa" la libreria, e' buona norma scoraggiare il riuso per 
ereditarieta' dell'implementazione, e incoraggiare quello per aggregazione e 
ereditarieta' dei servizi.
Tonnellate di framework e librerie OO scritte in C++ fino a meta' anni '90 (e 
relativa letteratura) e oltre hanno dimostrato ampiamente che questa e' una 
buona euristica.
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun