Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Cambiare la classe di una variabile
Forum - Java - Cambiare la classe di una variabile

Avatar
ale.gatti96 (Member)
Pro


Messaggi: 71
Iscritto: 29/11/2011

Segnala al moderatore
Postato alle 23:39
Sabato, 01/12/2012
Ho delle classi A1,A2,A3... che estendono A.

Esempio delle classi:
Codice sorgente - presumibilmente Java

  1. public class A{
  2.   public A(String s){
  3.     if(CONDIZIONE1)
  4.       //A diventa A1
  5.     else if(CONDIZIONE2)
  6.       //A diventa A2
  7.     [...]
  8.     else
  9.       //A diventa A5
  10.   }
  11.   [...]//Altri metodi
  12. }
  13.  
  14. public class A1 extends A{
  15.   [...]//Altri metodi
  16.   void metodo(int x){
  17.     [...]
  18.     //questo oggetto diventa un A2 o A3
  19.     [...]
  20.   }
  21. }
  22.  
  23. public class A2 extends A{
  24.   [...]//Altri metodi
  25.   void metodo(int x){
  26.     [...]
  27.     //questo oggetto diventa un A1 o A3
  28.     [...]
  29.   }
  30. }



Devo poter fare così:
Codice sorgente - presumibilmente Plain Text

  1. A var=new A("...");  // diventa ad es A1
  2. [...]
  3. var.metodo(3);   //var diventa ad es A2 o A3


Spero di essermi spiegato bene. Si può fare una cosa del genere?
Grazie

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 21:05
Domenica, 02/12/2012
Hai bisogno di una abstract factory.

PM Quote
Avatar
ale.gatti96 (Member)
Pro


Messaggi: 71
Iscritto: 29/11/2011

Segnala al moderatore
Postato alle 16:42
Lunedì, 03/12/2012
Grazie

PM Quote
Avatar
ale.gatti96 (Member)
Pro


Messaggi: 71
Iscritto: 29/11/2011

Segnala al moderatore
Postato alle 18:21
Martedì, 04/12/2012
Ho letto un po' su internet, ma non mi è chiara una cosa:

Per la Factory non ho problemi:
Codice sorgente - presumibilmente Java

  1. public class Factory{
  2.   public A make(String s){
  3.     if(CONDIZIONE-per-A1)
  4.       //return A1
  5.     else if(CONDIZIONE-per-A2)
  6.       //return A2
  7.     [...]
  8.     else
  9.       //return A5
  10.   }
  11.   [...]//Altri metodi
  12. }



Altre classi:
Codice sorgente - presumibilmente Java

  1. public class A1 extends A{
  2.   public void metodoCambiaA2(){[...]}
  3.   public void metodoCambiaA4(){[...]}
  4.   [...]//Altri metodi
  5. }
  6.  
  7. public class A2 extends A{
  8.   public void metodoCambiaA1(){[...]}
  9.   [...]//Altri metodi
  10. }



Poi in un altro metodo: (ad esempio in un metodo della classe B, o anche in un metodo di una classe A):
Codice sorgente - presumibilmente Java

  1. public class B{
  2.   public void metodo(){
  3.     A x,y;
  4.     x=Factory.make("a1");  //x ora è A1
  5.     y=Factory.make("a2");  //y ora è A2
  6.     [...]
  7.     x.metodoCambiaA2(); //x(A1) diventa A2
  8.     x.metodoCambiaA4(); //x(A2) diventa A4
  9.     y.metodoCambiaA1(); //y(A2) diventa A1
  10.     [...]
  11.   }
  12.   [...]//Altri metodi
  13. }



Non ho capito che cosa devo mettere in metodoCambiaA1[2,3,4,5...]() per far si che x cambi la classe.
Me lo potresti spiegare? Grazie.

Ultima modifica effettuata da ale.gatti96 il 04/12/2012 alle 18:32
PM Quote
Avatar
Remos (Normal User)
Newbie


Messaggi: 4
Iscritto: 07/01/2013

Segnala al moderatore
Postato alle 9:49
Martedì, 08/01/2013
Uhmmmm....ncs (non ci siamo), mi sa' che c'hai un po' di confusione in testa, oppure, me l'hai fatta venire a me...heheheh
Messo così, senza l'uso della Factory pare che tu non abbia ben compreso polimorfismo ed ereditarietà.
Con la factory, invece, mi sembra che tu ne stia facendo un uso improprio e, per altro, solo parzialmente corretto.
Alla fine, infatti, quando i nodi vengono al pettine ti sei giustamente chiesto: "cosa ci dovrei mettere nel metodoCambiaX?".
La risposta è che non ci puoi mettere nulla perchè, ad esempio, metodoCambiaA1 dell'oggetto A2 (pur essendo una sottoclasse di A) non sa' (e NON DEVE sapere!) dell'esistenza delle classi A1 e A2. Quindi: Come fai ad istanziarle?
Se vuoi cambiare il "comportamento" dell'oggetto non ha molto senso creare un oggetto con un tipo per poi cambiarlo subito dopo. Avrebbe più senso affidarsi al polimorfismo ed utilizzare uno strategy pattern che penso sia ciò che serve a te. Cioè un oggetto strategy che "ritorni" al client una variabile polimorfica. Una variabile che, in base a certe scelte, possa comportarsi come un oggetto di una una qualunque delle classi A1, A2, ecc. sottoclassi della classe A.
Non sarebbe male cmq se postassi il motivo concreto che ti ha spinto a trovare una soluzione di questo tipo, cioè cosa devi ottenere in realtà.

PM Quote
Avatar
ale.gatti96 (Member)
Pro


Messaggi: 71
Iscritto: 29/11/2011

Segnala al moderatore
Postato alle 23:41
Giovedì, 10/01/2013
Ciao, grazie di aver risposto.
Sono io che ho un po' di confusione in testa e probabilmente non mi sono spiegato bene. Il motivo concreto è che mi servono delle classi per gestire i numeri reali:
Quindi avrò una classe "Numero" (A) e poi le varie classi "Intero", "Frazione", "Radice", "Potenza" (A1, A2, A3 ...), fin qui nessun problema ma se devo ad esempio moltiplicare una variabile x di classe "Intero" per una (y) di classe "Frazione" la variabile x deve diventare una Frazione. esempio:
Codice sorgente - presumibilmente Plain Text

  1. Numero x=NumeroFactory.make("4");//quindi "Intero"
  2. Numero y=NumeroFactory.make("1/2");//quindi "Frazione"
  3. x.moltiplica(y);


x dopo moltiplica() deve diventare "Frazione" e contenere "2".
Come posso risolvere?
Grazie

PM Quote
Avatar
Remos (Normal User)
Newbie


Messaggi: 4
Iscritto: 07/01/2013

Segnala al moderatore
Postato alle 9:23
Sabato, 12/01/2013
Ok, dunque,  se non ho capito male stai cercando di creare una specie di calcolatrice virtuale.

A mio parare, probabilmente, java potrebbe non essere il linguaggio più adatto per questo compito.
A te serve una caratteristica chiamata "Operators overloading" che java non possiede (forse la 8?!). Dovresti rivolgerti a C++ o C# (che usa i delegates). Li puoi fare una cosa del tipo:
Codice sorgente - presumibilmente Java

  1. public static T operator -(T foo, T bar)



Ma se volessi proprio farlo in java ti consiglierei di studiare i generics. In ogni caso ti avviso subito che la quantità di codice da scrivere non credo sarà limitata.
Con Java e generics probabilmente dovresti partire da una cosa di questo tipo:
Codice sorgente - presumibilmente Java

  1. public interface Calcolatrice<T extends Number> {
  2.     public T somma(T a, T b);
  3. }


e poi implementare ogni classe come se fosse una singola calcolatrice in grado di fare una sola operazione (Addizione, moltipl..ecc):
Codice sorgente - presumibilmente Java

  1. public class CalcolatriceIntero implements Calcolatrice<Integer> {
  2.     public Integer somma(Integer a, Integer b) { return a + b; }
  3. }


L'ho buttata li al volo. Potrebbero esserci certamente soluzioni più eleganti, ma in java non credo sia cmq una passeggiata.

PM Quote
Avatar
ale.gatti96 (Member)
Pro


Messaggi: 71
Iscritto: 29/11/2011

Segnala al moderatore
Postato alle 18:12
Sabato, 12/01/2013
Avevo deciso di fare questo programma in java perché così dopo aver fatto la versione desktop, avrei potuto facilmente portarla su android (dove non ho mai lavorato) così da avere il cuore dell'app già funzionante e potermi dedicare all'interfaccia grafica.
Grazie dei consigli, studierò i generics.

PM Quote