De Nuevo Con Las Variables De Clase


Ir a la página 1, 2  Siguiente

Objetivo: 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

última edición por Shell el Sabado, 14 Enero 2017, 10:56; editado 1 vez

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

Objetivo: 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

Objetivo: 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

Objetivo: 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

Objetivo: 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".

Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: 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

Objetivo: 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)

Objetivo: 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

Objetivo: 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.

Ir a la página 1, 2  Siguiente

Página 1 de 2


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.3598s (PHP: -37% SQL: 137%)
Consultas SQL: 48 - Debug off - GZIP Activado