https://foro.gambas-es.org/viewtopic.php?f=1&t=5060&p=29398#p29398
-----------------------------------
Shell
Domingo, 27 Diciembre 2015, 12:11

Re: Clase Class
-----------------------------------
Y ahora...tatachan, vamos a usar Class.

Bien. Mi duda fue la siguiente. ¿ Por que tengo que tengo que tener dos métodos distintos en la clase "Facultativo" y la clase "Estudiante" ?.

Tengo el método "MostrarDatos" en la clase padre "Miembro".
Una opción posible era crear un método distinto "MostrarDatos" en las dos "subclases" para que mostrase cada propiedad.
( Recordemos que cada clase tiene sus "propiedades").

Buceando en la ayuda de Gambas. Encontré "Class" y "Object". Veréis lo útil que son:
Vamos a ver. Si pudiéramos iterar por cada "símbolo" que es el conjunto de "Propiedades" y "Métodos" de una clase,
podríamos ver los nombres de los "métodos" y las "propiedades" de una "clase"!!!.


Y este fue el código que hice para ver tanto las propiedades que eran cadenas, como arrays.

[code linenumbers=false syntax=gambas]
Public Sub MostrarDatos()
  
  'Nombre del simbolo de una clase, una propiedad, un método..
  Dim simbolo As String 
  'La clase
  Dim clase As Class    
  'Si la propiedad es un array almacenaremos su contenido en el array contenidoarray
  Dim contenidoarray As String[]
  
  'Obtenemos el nombre de la clase que pertenece el objeto
  clase = Object.Class(Me)
  
  'Iteramos sobre todos los simbolos de la clase que pertenece el objeto
  For Each simbolo In clase.Symbols
    'Si la clase de simbolo es una propiedad
    If clase[simbolo].Kind = Class.Property Then
      'Si el tipo de propiedad es un array
      If TypeOf(Object.GetProperty(Me, clase[simbolo].Name)) = gb.Object Then        
        'Mostramos el nombre del simbolo que es un array
        Print clase[simbolo].Name & ": ";
        'En caso de ser un array asignamos el contenido de la propiedad a la variable contenidoarray
        contenidoarray = Object.GetProperty(Me, clase[simbolo].Name)
        'Concatenamos el contenido del array
        Print contenidoarray.Join(" | ")
      Else
        'Mostramos el nombre del simbolo y su valor
        Print clase[simbolo].Name & ":", Object.GetProperty(Me, clase[simbolo].Name)
      Endif
    Endif
  Next
  
End
[/code]

Ya no tenía necesidad de ir cambiando individualmente los métodos de las subclases "Facultativo" y "Estudiante"

Entonces tome ese método y lo añadí a la clase principal "Miembro".

Quedando ahora la clase Miembro de está forma:

[code linenumbers=false syntax=gambas]
' Gambas class file

Property nombre As String
Private hnombre As String

Property direccion As String
Private hdireccion As String

Property mail As String
Private hmail As String

Public Sub _new(snombre As String, sdireccion As String, smail As String)
  
  hnombre = snombre
  hdireccion = sdireccion
  hmail = smail  
  
End

Private Function nombre_Read() As String
  
  Return hnombre
  
End

Private Sub nombre_Write(Value As String)
  
  hnombre = Value
  
End

Private Function direccion_Read() As String
  
  Return hdireccion
  
End

Private Sub direccion_Write(Value As String)
  
  hdireccion = Value  
  
End

Private Function mail_Read() As String
  
  Return hmail
  
End

Private Sub mail_Write(Value As String)
  
  hmail = Value
  
End

Public Sub MostrarDatos()
  
  'Nombre del simbolo de una clase, una propiedad, un método..
  Dim simbolo As String 
  'La clase
  Dim clase As Class    
  'Si la propiedad es un array almacenaremos su contenido en el array contenidoarray
  Dim contenidoarray As String[]
  
  'Obtenemos el nombre de la clase que pertenece el objeto
  clase = Object.Class(Me)
  
  'Iteramos sobre todos los simbolos de la clase que pertenece el objeto
  For Each simbolo In clase.Symbols
    'Si la clase de simbolo es una propiedad
    If clase[simbolo].Kind = Class.Property Then
      'Si el tipo de propiedad es un array
      If TypeOf(Object.GetProperty(Me, clase[simbolo].Name)) = gb.Object Then        
        'Mostramos el nombre del simbolo que es un array
        Print clase[simbolo].Name & ": ";
        'En caso de ser un array asignamos el contenido de la propiedad a la variable contenidoarray
        contenidoarray = Object.GetProperty(Me, clase[simbolo].Name)
        'Concatenamos el contenido del array
        Print contenidoarray.Join(" | ")
      Else
        'Mostramos el nombre del simbolo y su valor
        Print clase[simbolo].Name & ":", Object.GetProperty(Me, clase[simbolo].Name)
      Endif
    Endif
  Next
  
End
[/code]

Yyyyy naturalmente no tenía que crear un método distinto en las subclases Facultativo y Estudiante.
La salida fue igual que la primera: ( Añadiendo asignaturas al estudiante )

[quote]
mail:	paulaf@uca.es
nombre:	Paula Flores
direccion:	Cádiz
dando_cursos: Matemáticas básicas | Matemáticas avanzadas
codigo_facultativo:	F1234

mail:	josea@uca.es
nombre:	Jose Alvarez
direccion:	Puerto de Santa María
cursos_tomando: Latín
codigo_estudiante:	E3521
cursos_realizados: Matemáticas básicas | Historía del arte Romano
[/quote]

Aquí tenéis la modificación del código:

Que lo disfruten, comenten, comenten.  ;-) 

Saludos


