El encapsulamiento consiste en que tanto las propiedades como los métodos sean de uso exclusivo de el objeto en si mismo. Esto implica que no se pueda usar o modificar esos métodos y variables miembros desde afuera del objeto mismo.
Continuando pensando en un objeto Globo que en su clase o tipo de fine propiedades o métodos, por defecto son publicas. Esto permite modificar su dato desde afuera del objeto como tal.
Type CGlobo
Field color:string
Field material:String
Field aire:Byte
Method New( color:String = "Blanco", material:String = "Negro")
Self.color = color
self.material = material
End Method
End Type
Local miGlobo:CGlobo = New CGlobo("Azul", "Papel")
miGlobo.color = "Rosado"
El anterior código, muestra como se crea un objeto y se pasa sus características al momento de crearlo en el constructor. Un globo azul y de material de papel. Sin embargo afuera de la clase, se puede modificar su color y su material accediendo directamente a esas propiedades.
Entonces para hacer privadas esas variables miembros que nos interese o métodos usamos la palabra reservada “Private” y tiene dos variantes de uso.
Type CGlobo
Private
Field color:string
Field material:String
Field aire:Byte
Public
Method New( color:String = "Blanco", material:String = "Negro")
Self.color = color
Self.material = material
End Method
End Type
Local miGlobo:CGlobo = New CGlobo("Azul", "Papel")
miGlobo.color = "Rosado"
Se puede observar en el anterior código que las tres propiedades serían privadas, y que el método o constructor es publico. Es importante que para que esto funcione como se espera, la clase se debe declarar un en un fichero aparte y anexarla al principal mediante el comando “Import” donde se crea el objeto Globo.


Ya cuando intentamos compilar el programa nos encontramos con un error de ejecución que nos informa que esa propiedad no se puede modificar. Esto debido a que dentro de el tipo se declaro como privada.

La otra variante para declarar propiedades o métodos privados o públicos es hacerlo directamente cuando definimos la variable o el método. Para mí esto es lo mejor, pues facilita la lectura y el mantenimiento del código en el tiempo.
Type CGlobo
Private Field color:string
Private material:String
Private aire:Byte
Public Method New( color:String = "Blanco", material:String = "Negro")
Self.color = color
Self.material = material
End Method
End Type
Cambiando el valor de propiedades privadas
La única forma de cambiar esos datos definidos como privados, es desde adentro de la misma clase o tipo cuando el objeto ya esta creado. Para hacer esto podemos crear un método publico que modifique ese valor con algún parámetro.
Type CGlobo
Private Field color:string
Private material:String
Private aire:Byte
Public Method New( color:String = "Blanco", material:String = "Negro")
Self.color = color
Self.material = material
End Method
Public Method SetColor( color:String )
self.color = color
End Method
End Type
Ahora en el fichero principal creamos el objeto como tal.
Import "CGlobo.bmx"
Local miGlobo:CGlobo = New CGlobo
miGlobo.SetColor("Amarillo")
Por defecto se crea un objeto Blanco de material de goma, pues no se pasan parámetros en el constructor. Ya posteriormente se pinta el color de amarillo.
Ahora bien, igualmente se puede recuperar el dato de una variable miembro privada, solo es crear un método que se puede llamar por ejemplo “GetColor que retorne un tipo de dato cadena de texto.
Type CGlobo
Private Field color:string
Private material:String
Private aire:Byte
Public Method New( color:String = "Blanco", material:String = "Negro")
Self.color = color
Self.material = material
End Method
Public Method SetColor( color:String )
self.color = color
End Method
Public Method GetColor:String()
Return Self.color
End Method
End Type
Y ya en el fichero principal fuera de cambiar el valor o asignar uno nuevo podemos leer el contenido de la propiedad color del objeto.
Import "CGlobo.bmx"
Local miGlobo:CGlobo = New CGlobo
miGlobo.SetColor("Amarillo")
Print( miGlobo.GetColor() )
Ya para finalizar, en BlitzMax el asunto de la encapsulación es limitado, pero si decide dar el paso a lenguajes como c# o c++, verá que esos lenguajes extienden aún mas el tema de encapsulación.
Deja una respuesta