Hemos diseñado un constructor que evita que el usuario pueda introducir valores superiores a 100 en hp y a 5 en ap.
Sin embargo, el usuario aun puede acceder a dichos valores como miembros que son de la clase y modificarlos a su antojo, evitando dicha comprobación del constructor:
Para evitar eso debemos utilizar los modificadores de visibilidad que permiten restringir el acceso a diferentes partes del código (variables, clases, constructores...):
private: Marca una declaración como visible en la clase o archivo actual.
protected: Marca una declaración como visible en la clase y subclases de la misma.
internal: Marca una declaración como visible en el módulo actual.
public: Marca una declaración como visible en todas partes.
De esta manera estaríamos aplicando el principio de ocultación:
// Las lineas de abajo, ahora darán error.println("name: "+ azulito.name)println("hp: "+ azulito.hp)println("ap: "+ azulito.ap)println("alive: "+ azulito.alive)azulito.hp =1000000azulito.ap =500
Sin embargo, ahora no podemos acceder a la información almacenada en las variables ni modificarla. Para eso se utilizan las funciones get y las funciones set.
Las funciones get() nos permiten acceder a la información almacenada dentro de las propiedades de un objeto:
Cuando se crea un atributo val, el compilador crea una función get() por defecto que es la que en el ejemplo inmediatamente inferior estamos personalizando.
No se crea función set() ya que una val no puede modificar su valor.
classSlime (name: String="slimePorDefecto", hp: Int=100, ap: Int=5){var name: String// esta no es private para el ejemploget() ="Este Slime se llama: $field."privatevar hp: Intget() ="Este Slime tiene $field Puntos de Salud."privatevar ap: Intget() ="Este Slime tiene $field Puntos de Ataque."privatevar alive: Boolean=trueget() =field
println(azulito.name) // Este Slime se llama: Azulito.
Sin embargo, al haber hecho nuestras variables privadas, no va a servir esta forma de ejecutar los getters ya que no tenemos capacidad de visualizarlos.
Tendremos que utilizar la siguiente opción. Crear funciones miembro de la clase que hagan el trabajo de las funciones get():
Se utilizan para modificar el contenido de un atributo.
Cuando se crea un atributo var, el compilador crea una función get() por defecto, así como una función set() que es la que en el ejemplo inmediatamente inferior estamos personalizando.
classSlime (name: String="slimePorDefecto", hp: Int=100, ap: Int=5){var name: String// esta no es private para el ejemploget() ="Este Slime se llama: $field."privatevar hp: Intget() ="Este Slime tiene $field Puntos de Salud."set(value) {if (value>100) field= Random.NextInt(0, 100) elsefield=value }privatevar ap: Intget() ="Este Slime tiene $field Puntos de Ataque."set(value) {if (value>5) field= Random.NextInt(0, 5) elsefield=value }privatevar alive: Boolean=trueget() =field
Sin embargo, como ha pasado anteriormente, no podemos hacer esto pues hemos hecho privados nuestros atributos.
Para solventarlo vamos a crear unas funciones que actuen como los setter que hemos definido arriba: