https://foro.gambas-es.org/viewtopic.php?f=1&t=6125&p=36655#p36655
-----------------------------------
Shell
Sabado, 14 Enero 2017, 10:52

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.

[code linenumbers=false syntax=gambas]
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
[/code]

Procedimiento para probar.

[code linenumbers=false syntax=gambas]
Public Sub UsandoClaseContactoOld()
  Dim c1 As ContactoOld 
  
  c1 = New ContactoOld("Alberto", "alberto@gmail.com")
   
End
[/code]

Salida en la consola:

[quote]
gbx3: warning: circular references detected:
gbx3:     1 ContactoOld
[/quote]

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

[code linenumbers=false syntax=gambas]
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
[/code]

La llamada al procedimiento.

[code linenumbers=false syntax=gambas]
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  
[/code]

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

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.

[code linenumbers=false syntax=python]
#!/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()
[/code]

 [img]https://foro.gambas-es.org/files/images/768/capturaconsola_1484386224_102162.png[/img]

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

[code linenumbers=false syntax=gambas]
 Print Contacto.listacontactos[0].nombre 'No es un objeto
 Print c1.listacontactos[0].nombre ' Contacto.listacontactos es static.
[/code]

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

Saludos


