Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

De Nuevo Con Las Variables De Clase

De Nuevo Con Las Variables De Clase
Artículo
Responder citando    Descargar mensaje  
Mensaje De Nuevo Con Las Variables De Clase 
 
Buenos días!.

Voy a mostraros un ejemplo en el que usando una clase me da error y usando la misma clase con una leve variación, no.
Pero no logro del todo lo que quiero hacer.

Tengo la clase ContactoOld ( que es la errónea, o en la que lo hago mal ).
Estoy intentando averiguar los valores de las propiedades de los objetos de la clase añadidos a la variable de clase listacontactos.

Private $email As String
Private $nombre As String

Property email As String
Property nombre As String

Static Public listacontactos As New Variant[]

Public Sub _new(nom As String, ema As String)
  
  With Me
    .nombre = nom
    .email = ema
  End With
  
  ContactoOld.listacontactos.Add(Me)
  
End

Private Function nombre_Read() As String
  
  Return $nombre    
  
End

Private Sub nombre_Write(Value As String)
  
  $nombre = Value
  
End

Private Function email_Read() As String
  
  Return $email
  
End

Private Sub email_Write(Value As String)
  
  $email = Value
  
End
 


Procedimiento para probar.

Public Sub UsandoClaseContactoOld()
  Dim c1 As ContactoOld
  
  c1 = New ContactoOld("Alberto", "alberto@gmail.com")
  
End
 


Salida en la consola:

Citar:

gbx3: warning: circular references detected:
gbx3:     1 ContactoOld


Ahora la variación de la clase. Esta vez uso en la misma clase un método estático que llamo desde el constructor

Private $email As String
Private $nombre As String

Property email As String
Property nombre As String

Static Public listacontactos As New Variant[]

Public Sub _new(nom As String, ema As String)
  
  With Me
    .nombre = nom
    .email = ema
  End With
  
  Me.anade()
  
End

Private Function nombre_Read() As String
  
  Return $nombre    
  
End

Private Sub nombre_Write(Value As String)
  
  $nombre = Value
  
End

Private Function email_Read() As String
  
  Return $email
  
End

Private Sub email_Write(Value As String)
  
  $email = Value
  
End

Static Public Sub anade()
  
  Contacto.listacontactos.Add(Me)  
  
End
 


La llamada al procedimiento.

Public Sub UsandoClaseContacto()
  
  Dim c1 As Contacto
  Dim c2 As Contacto
  Dim ctemp As Class
  
  c1 = New Contacto("Alberto", "alberto@gmail.com")
  c2 = New Contacto("Pedro", "pedro@yahoo.es")
  
  Print Contacto.listacontactos.Count
  Print Contacto.listacontactos[1]
  
  For Each ctemp In Contacto.listacontactos
    Print ctemp.Symbols
  Next
  
End  
 


Citar:

2
(Class Contacto)
(String[] 0xb3a578)
(String[] 0xb3a578)


Son solo pruebas. Si ya me esta dando que contiene un array de string, con un bucle anidado se podría ver.

Ahora os muestro algo similar en Python. Prueba en la consola.

#!/usr/bin/env python3

class Contacto:
    todos_contactos = []

    def __init__(self, nombre, email):
        self.nombre = nombre
        self.email = email  
        Contacto.todos_contactos.append(self)

def main():
    pass

if __name__=='__main__': main()
 


 capturaconsola_1484386224_102162

Si yo en gambas usara algo como esto, con la clase instanciada en el objeto c1.
Os pongo al lado, el error que da:

Print Contacto.listacontactos[0].nombre 'No es un objeto
 Print c1.listacontactos[0].nombre ' Contacto.listacontactos es static.
 


Os adjunto el código en gambas. Mas parece que añadió una clase y no un objeto de clase.

Saludos

VariableDeClase.tar.gz
Descripción:  
Descargar
Nombre del archivo: VariableDeClase.tar.gz
Tamaño: 12.93 KB
Descargado: 90 veces
VariableDeClase.tar.gz
Descripción:  
Descargar
Nombre del archivo: VariableDeClase.tar.gz
Tamaño: 12.93 KB
Descargado: 90 veces
VariableDeClase.tar.gz
Descripción:  
Descargar
Nombre del archivo: VariableDeClase.tar.gz
Tamaño: 12.93 KB
Descargado: 90 veces




 
última edición por Shell el Sabado, 14 Enero 2017, 10:56; editado 1 vez 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Sabado, 14 Enero 2017, 10:52 ]
 


De Nuevo Con Las Variables De Clase
Comentarios
Responder citando    Descargar mensaje  
Mensaje Re: De Nuevo Con Las Variables De Clase 
 
Si yo hiciera esto:

..
Dim ctemp As Class
..
For Each ctemp In Contacto.listacontactos
    Print ctemp.Symbols
    Stop
Next
 


Puedo ver tanto las propiedades de la clase como parte de sus métodos.

 simbolosenlaclase

Saludos



 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Sabado, 14 Enero 2017, 11:06 ]
Responder citando    Descargar mensaje  
Mensaje Re: De Nuevo Con Las Variables De Clase 
 
Por cierto.

Class.Simbol aunque en la ayuda dice que da una "colección", mas que una colección es un array.  

Citar:

Property Read Symbols As String[]

Returns a collection of all the symbol names of a class.


Saludos



 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Sabado, 14 Enero 2017, 11:28 ]
Responder citando    Descargar mensaje  
Mensaje Re: De Nuevo Con Las Variables De Clase 
 
Shell:

El error en la clase ContactoOld:
Citar:
gbx3: warning: circular references detected:
gbx3: 1 ContactoOld


Se produce cuando gambas3 intenta cerrar el programa, y creo que es porque gambas3 no puede borrar la clase ContactoOld (o algo que esta dentro de ella) ya que esta siendo usada por otra variable.. Parece que  al usarla directamente en el constructor _new se produce ese enlace... Sin embargo cuando la usas llamando desde otro método (anade) , no se produce ese enlace.... es muy curioso

Si añades al código:
  ContactoOld.listacontactos = Null
Esa referencia circular, queda "rota", y ya no muestra el mensaje de advertencia.

Te adjunto el código corregido....

VariableDeClase-0.0.2.tar.gz
Descripción: Con modificacion... 
Descargar
Nombre del archivo: VariableDeClase-0.0.2.tar.gz
Tamaño: 11.64 KB
Descargado: 100 veces
VariableDeClase-0.0.2.tar.gz
Descripción: Con modificacion... 
Descargar
Nombre del archivo: VariableDeClase-0.0.2.tar.gz
Tamaño: 11.64 KB
Descargado: 100 veces
VariableDeClase-0.0.2.tar.gz
Descripción: Con modificacion... 
Descargar
Nombre del archivo: VariableDeClase-0.0.2.tar.gz
Tamaño: 11.64 KB
Descargado: 100 veces




 
jsbsan - Ver perfil del usuario Enviar mensaje privado  
jsbsan [ Sabado, 14 Enero 2017, 13:13 ]
Responder citando    Descargar mensaje  
Mensaje Re: De Nuevo Con Las Variables De Clase 
 
jsbsan escribió: [Ver mensaje]

Si añades al código:
  ContactoOld.listacontactos = Null
Esa referencia circular, queda "rota", y ya no muestra el mensaje de advertencia.

Óptima sugerencia.

Solo por mera curiosidad, es posible usar tambien la función externa "exit( )" de la libreria dinamica "libc.so.6".
En este caso la función externa debería ser declarada con Extern y ser puesta en lugar de la raya "ContactoOld.listacontactos = Null".



 
vuott - Ver perfil del usuario Enviar mensaje privado  
vuott [ Sabado, 14 Enero 2017, 15:23 ]
Responder citando    Descargar mensaje  
Mensaje Re: De Nuevo Con Las Variables De Clase 
 
Además, los accesos de lectura/escritura de las propiedades "email" y "nombre" deben de ser públicos.

Saludos



 
jguardon - Ver perfil del usuario Enviar mensaje privado  
jguardon [ Sabado, 14 Enero 2017, 15:35 ]
Responder citando    Descargar mensaje  
Mensaje Re: De Nuevo Con Las Variables De Clase 
 
Julio:

Gracias, ya funciona. No tenía ni idea de que se necesitase esa liberación final.
Debe ser algo propio de Gambas.
En consola nunca había visto este tipo de errores. Tengo otros ejemplos que tengo
que modificar ya que tienen el mismo problema usando estas clases.

Vuott:

Vaya, al final lo logré con ese método también.

Library "libc:6"

Extern exit() As Integer

Public Sub Main()

  UsandoClaseContactoOld()

End

Public Sub UsandoClaseContactoOld()

  Dim c1 As ContactoOld

  c1 = New ContactoOld("Alberto", "alberto@gmail.com")

  Print ContactoOld.listacontactos.Count
  Print ContactoOld.listacontactos[0].nombre

 exit()
  
  'ContactoOld.listacontactos = Null

End

 


Se mezclaba el Exit() de gambas . Y es que es en minúscula. Y en vez de libc:6
estaba usando el nombre completo de la librería. Claro que en un Linux de 64b hay dos:

Citar:

./x86_64-linux-gnu/libc.so.6
./i386-linux-gnu/libc.so.6


Jesús:

Citar:

Además, los accesos de lectura/escritura de las propiedades "email" y "nombre" deben de ser públicos.


Son accesible con la propiedad. ¿ Qué más necesitas que eso ?.  
En el código que he mostrado de Python son públicas, claro.

Por cierto, estos ejemplos que estoy haciendo en gambas son gracias al curso de Inicio práctico a la programación con Python 3.X,
de Jesús Conde.

Curso Inicio práctico a la programación con Python 3.X de Jesús Conde.

Saludos



 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Sabado, 14 Enero 2017, 19:32 ]
Responder citando    Descargar mensaje  
Mensaje Re: De Nuevo Con Las Variables De Clase 
 
jajaj siempre explorando shell!!
estoy esperando algún programa hecho por vos!!
a ver si nos sorprendes heee, ya tenes mas que suficientes herramientas para comenzar!!
jajjajaj

saludos


/me porque aún shell no ha hecho ningún programa? (para los chateros jajajaj)



 
v3ctor - Ver perfil del usuario Enviar mensaje privado  
v3ctor [ Domingo, 15 Enero 2017, 23:37 ]
Responder citando    Descargar mensaje  
Mensaje Re: De Nuevo Con Las Variables De Clase 
 
v3ctor:

Citar:

me porque aún shell no ha hecho ningún programa? (para los chateros jajajaj)


 

Cierto. Nunca acabo haciendo una aplicación de un tamaño considerado.
Es que intento siempre estar viendo diferentes cosas y es que la programación
abarca mucho. Parece no tener fin.

Digamos que me gusta conocer cosas , pero no me acabo de decidir en que emplearlas.
Al igual que la programación modular, que esta formada por muchas partes, tengo que ir
tomando cada parte y crear un todo.

Cuando haces una aplicación grande requiere mucho tiempo y una gran dedicación.
A medida que avanzo y leo me van asaltando otros y otros ejemplos, ocurrencias
que intento cazar al vuelo, para que no se me olviden me tengo que poner con ellos.
De una misma idea, surgen otras y así recursivamente.

Me gusta los ejemplos pequeños, que demuestran cosas interesantes.
Como son pequeñas funciones.

Saludos



 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Lunes, 16 Enero 2017, 01:28 ]
Responder citando    Descargar mensaje  
Mensaje Re: De Nuevo Con Las Variables De Clase 
 
pero shell no te enredes ni te ahogues en un vaso de agua.
la cosa es bien simple el programa se hace para solucionar un problema en concreto o hacer una tarea especifica.
si no programas nada tal vez no tengas la necesidad de resolver ningún problema o hacer alguna tarea importante.

así es como nacen los programas, ellos resuelven un problema en concreto.

para mi taller2015 por ejemplo me hace de ayudante administrativo jajjajaj.

saludos.



 
v3ctor - Ver perfil del usuario Enviar mensaje privado  
v3ctor [ Lunes, 16 Enero 2017, 16:19 ]
Mostrar mensajes anteriores:    
 
Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 



 

cron