Comunidad de diseño web y desarrollo en internet online

Problema con datos privados de clase al instanciarla

Citar            
MensajeEscrito el 12 Oct 2006 10:35 pm
Antes que nada Buenas noches!!!
Tengo un problema el cual realmente no supe resolver.

Este codigo que copio debajo es un testing al que llegue luego de limpiar completamente mi clase

En mi clase tengo una propiedad de tipo privada que es un objeto array
Esta propiedad es cargada por un metodo
public function agregar(asName:String)

El problema puntual es que al instanciar la misma clase creando 2 objetos diferentes la propiedad datos_array persiste en ambas, algo que seria logico en el caso de que el tipo de propiedad sea static, pero como se puede ver es private


Aqui debajo copio el codigo de la clase


////////////////////////
// inicio codigo clase ///
////////////////////////

Código :

class testingBug {
   private var datos_array:Array = new Array();
   public function testingBug() {
      trace("*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/");
      buscarDatoArray();
   }
   //
   public function buscarDatoArray() {
      trace("Busco datos en Array");
      trace("cantidad:"+datos_array.length);
      var cantidadSonidos:Number = datos_array.length;
      var sonidoName:String = null;
      for (var i:Number = 0; i<cantidadSonidos; i++) {
         trace("Busco Dato:"+i+"<<<<<");
         trace(datos_array[i]);
      }
   }
   //
   public function agregar(asName:String) {
      var mensaje = "";
      if (this.buscarDatoArray(asName) != undefined) {
         mensaje = "El string ya se encuentra registrado="+asName;
      } else {
         datos_array.push(asName);
         mensaje = "Dato registrado exitosamente: "+datos_array[datos_array.length-1];
      }
      trace(mensaje);
   }
}



////////////////////////
// fin codigo clase ///
////////////////////////


Luego en la linea de tiempo de mi pelicula fla instancio la clase y cargo datos de la siguiente manera

////////////////////////
// inicio codigo fla ///
////////////////////////

Código :

// instancia 1 de clase testingBug
var instancia1:testingBug = new testingBug(this);
instancia1.agregar("dato0");
instancia1.agregar("dato1");
instancia1.agregar("dato2");
instancia1.agregar("dato3");
instancia1.agregar("dato4");
// instancia 2 de clase testingBug
var instancia2:testingBug = new testingBug();

////////////////////////
// fin codigo fla ///
////////////////////////


Como se puede ver en el trace al ejecutar la pelicula al instanciarse por 2da vez la clase siguen existiendo todos los valores dentro del array "datos_array"


Si alguien sabe como solucionar esto o donde la estoy pifiando les agradecere la respeusta!!!

Saludos
Pablo

Por cv_pablos

8 de clabLevel



 

msie
Citar            
MensajeEscrito el 12 Oct 2006 10:44 pm

Código :

class testingBug {

   private var datos_array:Array;

   public function testingBug() {

      datos_array = new Array()
       trace("*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/");

      buscarDatoArray();
    }
 /* Demas codigo */


saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 13 Oct 2006 12:29 am
La verdad que no le encuentro logica

Diferentes instancias de la clave deberian no comparir los valores de este array.
Esta ok que en el constructor podes blanquear la variable y quedan diferentes para cada una de las clases pero no entiendo porque la 2da instancia de la clase hereda el array tal cual como fue cargado en la primera

saludos
Pablo

Por cv_pablos

8 de clabLevel



 

msie
Citar            
MensajeEscrito el 13 Oct 2006 01:21 am

cv_pablos escribió:

La verdad que no le encuentro logica

Tiene pinta de bug, asi que mejor no buscarle la logica...

Pero la manera correcta de dar valor a las variables es dentro del constructor:

Código :

class testingBug {
   private var variable:Array;
   public function testingBug() {
      variable = new Array();
   }
}

y al poner el new Array() fuera del contructor te ha quedado la variable con estatica (pasa con los arrays aun sin haber escrito static) y por lo tanto es comun a todas las instancias. No deberia ser así, pero bueno...

De la misma manera que si no defines el tipo de clase al crear la instancia:

Código :

var instancia1:testingBug = new testingBug();
var instancia1 = new testingBug(); <-- mal

podrás acceder a todas las variables y funciones aunque las hayas definido como privadas...
Son bugs de actionscript...

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 13 Oct 2006 01:54 am
Ambos prueben esto:

MyClass2

Código :

class MyClass2
{
   function MyClass2()
   {
      trace("MyClass2");
   }
}


MyClass

Código :

import MyClass2;
class MyClass{
   var obj:MyClass2 = new MyClass2();
   var obj2:MyClass2;
   function MyClass(){
      obj2   = new MyClass2()
   }
   function change(){
   }
}


archivo.fla

Código :

import MyClass;

var obj:MyClass = new MyClass();


La ventana de salida le dará la respuesta.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 13 Oct 2006 09:40 am
mmm... curioso. Gracias Maikel (y)
PD. encuentrame una explicación para lo de las variables privadas... please

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 13 Oct 2006 11:31 am
Si, si alguien tiene respuesta o ducumentacion sobre este posible bug de las variables privadas de tipo array que se replican en otras instnacias de la misma clase seria bueno saberlo porque es muy loco!!!!!!!
No entiendo porque la variable privada de clase en este caso de tipo array guarda su valor como su fuese una variable static, la verdad que no le veo logica !!!

Tengo otro problema que me paso hace un tiempo lo voy a postear en otro post ya que es otro tema, pero si me pueden ayudar desde ya aclararia algunas dudas que tengo!!!

saludos
Pablo

Por cv_pablos

8 de clabLevel



 

msie
Citar            
MensajeEscrito el 13 Oct 2006 03:48 pm

cv_pablos escribió:

Si, si alguien tiene respuesta o ducumentacion sobre este posible bug de las variables privadas de tipo array que se replican en otras instnacias de la misma clase seria bueno saberlo porque es muy loco!!!!!!!
No entiendo porque la variable privada de clase en este caso de tipo array guarda su valor como su fuese una variable static, la verdad que no le veo logica !!!

Tengo otro problema que me paso hace un tiempo lo voy a postear en otro post ya que es otro tema, pero si me pueden ayudar desde ya aclararia algunas dudas que tengo!!!

saludos
Pablo

¿Ya probaste el código que dijo Maikel? :roll: Te dará el siguiente error:
Línea 3: Sólo se pueden inicializar las variables de instancia de una clase para compilar/cronometrar expresiones de constantes.
var obj:MyClass2 = new MyClass2();

osea que coloca el new Array() dentro del constructor...

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 13 Oct 2006 04:53 pm
Ok, quedamos claro en que NO puede ir la invocación del constructor ¿No? Por lo tanto la propiedad privada NO se inicializa, ¿cierto?.

Bien, lo más probable es que Macromedia use para representar los valores de array es con punteros. Cuando estos no son inicializados quedan con información "basura", en este caso el segundo objeto le queda la información del primer objeto. Cuestion de direcciones de memoria y eso.

Esto lo menciono como programador C/C++(alguna vez lo fui xD ) y solo es una especulación, pero es lo que se me hace realmente y no lo llamaría un bug.


zguillez escribió:

PD. encuentrame una explicación para lo de las variables privadas... please


¿Que pasa con las variables privadas?

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 13 Oct 2006 06:03 pm

Maikel escribió:

¿Que pasa con las variables privadas?

Imagínate esta clase:

Código :

class Ops {
   private var ops:String;
   public function Ops() {
      ops = "ops!";
   }
   private function getOps() {
      trace(ops);
   }
}

la variable y la funcion son privadas, con lo que no podemos acceder a ellas desde fuera de la clase:

Código :

var obj:Ops = new Ops();
trace(obj.ops);
obj.getOps();

Nos saldrán dos errores... Lo normal

Pero si no definimos el tipo al crear la instancia de la clase:

Código :

var obj = new Ops(); <---------- no puse el ":Ops"
trace(obj.ops);
obj.getOps();

Si podemos acceder aun siendo privadas...

Salida escribió:

ops!
ops!

raro, no? :?

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 13 Oct 2006 07:06 pm
Ok justo lo que me imaginaba, solo quería confirmar que te referías a eso.

Mira:

Código :

var obj:Ops = new Ops();
var obj2 = new Ops();


En obj declarás el tipo de dato, por lo que estas añadiendo el comportamiento de ese tipo de dato (clase) que es donde esta definido el metodo de acceso a las propiedades y metodos.

Ahora recuerda que en flash las variables(tipo Object) por defecto son dinámicas, es decir, que puedes cambiar los tipos de datos y añadir propiedades a tu gusto. Por lo que, en obj2 estas asignandole todas sus propiedades y metodos, en este caso obj2 es de tipo Object y no de tipo Ops, por lo que las propiedades añadidas son dinámicas y publicas.

mira esto:

Código :

var obj = new Number(3);
trace(typeof(obj));
trace(obj);
obj = new String("cadena");
trace(typeof(obj));
trace(obj);

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 13 Oct 2006 09:33 pm
:o :alabado: :alabado: :alabado: :alabado: :alabado: :alabado:

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 13 Oct 2006 10:47 pm

Zguillez escribió:

:o :alabado: :alabado: :alabado: :alabado: :alabado: :alabado:

Me too U_U
:alabado: :alabado: :alabado: :alabado:

Por Zah

BOFH

4290 de clabLevel

27 tutoriales
5 articulos

  Bastard Operators From Hell Editores

Zaragoza, España

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.