Para hacer una clase «extensible» o «heredable» en Kotlin, tenemos que marcarlo como open.
– Clase en Java –> por defecto open
– Clase en Kotlin –> por defecto es final (no puede ser extendida sin el uso de ‘open’)
Modificadores de Acceso:
– public –> Visible desde dentro de la clase, de sus subclases y desde fuera
– protected –> Sólo visible dentro de la clase y de sus subclases (herencia)
– private –> Sólo visible dentro de la clase
open class AccessModifiers { val prop1 = "Public by default" private val prop2 = "Marked as private" protected val prop3 = "Marked as protected" protected fun showCase(){ val test = AccessModifiers() test.prop1 test.prop2 test.prop3 this.prop1 prop1 } } class AccessModifiedChild : AccessModifiers(){ private fun showCaseX(){ super.showCase(); prop1 this.prop1 // prop2 //Por ser private no puede ser accesible this.prop3 } } class AnotherClass{ private fun showCase(){ val test = AccessModifiers() test.prop1 } }
Clase AccessModifiers
La marcamos como open para que puedan heredar de ella
showCase()
La marcamos como protected para que otras clases que hereden de AccessModifiers puedan utilizarla.
val test
Es una objecto de la clase AccessModifiers.
Puede acceder a las 3 propiedades (test.prop1, test.prop2 y test.prop3 ) aún siendo una instancia externa, porque esta dentro del contexto de AccessModifiers.
El this.prop1 y prop1 apunta a la propiedad de la clase, no al de la instancia.
Clase AccessModifiedChild
Puede heredar de la clase AccessModifiers porque la marcamos como «open»
Al heredar de la clase AccessModifiers no podemos nombrar una función con el mismo nombre que la que implementa el padre, por eso la llamamos showCaseX().
showCaseX()
prop1 y this.prop1 se refiere al de la clase padre.
prop2 no nos deja acceder porque es privado y la propiedad sólo visible dentro de la clase
prop3 si nos deja acceder porque es protected y es una subclase (herencia).
Clase AnotherClass()
Es una clase externa totalmente a AccessModified
showCaseX()
test es una instancia de la clase AccessModified
Solamente nos deja llamar a la propiedad de la clase prop1 porque es la única marcada como publica.
prop2 es una propiedad solo visible dentro de la clase
prop3 es una propiedad visible dentro de la clase y de sus herederos.
Por tanto, al no heredar de dicha clase, solamente se nos muestra las propiedades publicas.