Buenas!.
En el lenguaje Java (supongo que este también lo puede hacer de distintas formas). Los atributos, sus propiedades
pueden ser privadas, ocultas.
Lo curioso de Java es que para esto, cuando hablamos de propiedades, ejemplo, color, edad, (si fueran propiedades) usa el
comando "this", en Gambas usamos "Me" como referencia. Ahora bien, una propiedad creada en Gambas es
"pública". Cuando declaramos una instancia de esa clase o la usamos, "siempre" estamos viendo sus propiedades.
A modo de ejemplo os mostraré algo creado en Gambas. La idea es que hay que "ocultar" sus propiedades o lo que quieran
que solo este al alcance lo que interesa. (No todo).
He creado una clase Alumno y una clase Alumno2.
Alumno:
Código:
Property nombre As String Use $nombre
Property edad As Integer Use $edad
Public Sub _new(nom As String, ed As Integer)
Me.nombre = nom
Me.edad = ed
End
Y ahora parecida, Alumno2
Código:
Private nombre As String
Private edad As Integer
Public Sub _new(nom As String, ed As Integer)
nombre = nom
edad = ed
End
Public Function getnombre() As String
Return nombre
End
Public Sub getedad() As Integer
Return edad
End
En este último caso, no se puede cambiar la propiedad edad o nombre desde su instancia, (no lo vemos), solo podemos obtenerlo.
Y si queremos ya cambiarlo, pues se crearía un método para ello. O nos olvidaríamos de otros métodos. como getedad o setedad.
En la clase principal he usado esto:
Código:
Public Sub Form_Open()
Ejemplo1()
Ejemplo2()
End
Public Sub MostrarAlumnos(lista As Object)
If lista Is Array Then
If Object.Type(lista[0]) = "Alumno" Then
For Each al1 As Alumno In lista
Print "Nombre: " & al1.nombre & " edad: " & al1.edad
Next
Else If Object.Type(lista[0]) = "Alumno2" Then
For Each al2 As Alumno2 In lista
Print "Nombre: " & al2.getnombre() & " edad: " & al2.getedad()
Next
Endif
Else
Print "Esto no es un array"
Endif
Print
End
Public Sub Ejemplo1()
Dim aalumnos As Alumno[]
Dim al As Alumno
aalumnos = New Alumno[]
al = New Alumno("Julio", 15)
aalumnos.Add(al)
al = New Alumno("Maria", 21)
aalumnos.Add(al)
al = New Alumno("Roman", 12)
aalumnos.Add(al)
MostrarAlumnos(aalumnos)
End
Public Sub Ejemplo2()
Dim aalumnos2 As Alumno2[]
Dim al As Alumno2
aalumnos2 = New Alumno2[]
al = New Alumno2("Julio", 15)
aalumnos2.Add(al)
al = New Alumno2("Maria", 21)
aalumnos2.Add(al)
al = New Alumno2("Roman", 12)
aalumnos2.Add(al)
MostrarAlumnos(aalumnos2)
End
¿ Qué opinan ustedes de la visibilidad de las propiedades o métodos en la programación orientada objeto en "Gambas" ?
Normalmente no uso formas como el ocultar las propiedades y luego mediante un método acceder a esta. Suelo declarar
propiedades. Y ya saben que estas son públicas.
Ah, en Python no existe algo como private o públic, son públicas, todas. En cambio en Java si y en C++ seguramente si.
Otra forma, declarar la propiedad como solo lectura.
Código:
Property Read nombre As String Use $nombre
Property Read edad As Integer Use $edad
Public Sub _new(nom As String, ed As Integer)
$nombre = nom
$edad = ed
End
Private Function nombre_Read() As String
Return $nombre
End
Aunque es de solo lectura, es visible. Pero no puedes cambiarla, es casi como una constante, como un variable de clase ( no de instancia ).
Que estas pueden ser públicas y ojo con eso. Imaginar que a la hora de crear una clase, siempre se crea con valores por defecto.
coche , cuatro ruedas y así. Y ahora viene alguien y dice, pues no, ahora voy y le cambio la propiedad de ruedas y digo que el coche
cuando ya se ha creado la instancia, que va a tener seis ruedas. ( Pero ojo, eso solo cambia en la instancia, no la clase ).
Saludos