Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Matanza
Clase 3:
Clases y Objetos
Android Development with Kotlin v1.0 This work is licensed under the Apache 2 license. 2
Agenda
3
Clases
4
Clase
Clase
5
Class versus object instance
Clase Casa
Datos
Behavior
● actualizarColor() EN VENTA
6
● ponerEnVenta()
Definir y usar clases
Definición de la clase Crear una nueva instancia de
Casa
class Casa {
val miCasa = Casa()
val color: String = "white"
●Ningún Parámetro
class A
● Parámetros
○ Sin marcar como var o val → estos solo existirán dentro del ámbito
del constructor
class B(x: Int)
○ Marcados como var o val → existirán en el ámbito de la instancia
class C(val y: Int) 8
Ejemplos de constructores
class A val aa = A()
val bb = B(12)
class B(x: Int)
println(bb.x)
println(cc.y)
9
=> 42
Parámetros por defecto
Las instancias de la clase pueden tener valores por defecto.
●Usamos valores por defecto para reducir las necesidades del constructor
●Podemos mezclar parámetros por defecto con requeridos
●Más específicamente (no necesitamos tener múltiples versiones de un mismo constructor)
class Box(val length: Int, val width:Int = 20, val height:Int = 40)
val box1 = Box(100, 20, 40)
val box2 = Box(length = 100)
val box3 = Box(length = 100, width = 20, height = 40)
10
Constructor primario
Declaración del constructor primario fuera del encabezado de la clase.
class Circle(i: Int) {
init {
...
}
}
Esto es técnicamente igual a.
class Circle {
constructor(i: Int) {
...
}
11
}
Initializer block
12
Ejemplo de initializer
init {
println(side * 2)
val s = Square(10)
=> 20 13
Múltiples constructores
OR
○ A otro constructor secundario que llame al constructor primario
constructor(name:String) : this(1.0)
init {
} 15
Propiedades
16
Clase persona con propiedad name
fun main() {
println(person.name)
} 17
Custom getters y setters
Si no queremos tener el comportamiento por defecto de get/set:
21
Herencia
22
Herencia
24
Ejemplo de Interfaz
interface Shape {
fun computeArea() : Double
}
class Circle(val radius:Double) : Shape {
override fun computeArea() = Math.PI * radius * radius
}
val c = Circle(3.0)
println(c.computeArea())
=> 28.274333882308138 25
Extending classes
26
Creando una nueva clase
27
Las clases son “final” por defecto
Declarar la clase
class A
Intentamos heredar A
class B : A
28
Uso de la palabra clave open
Usamos open para declarar que una clase puede ser “heredada”.
Declaramos la clase
open class C
Heredamos de C
class D : C()
29
Sobreescribiendo
● Debemos usar open para las propiedades y métodos que pueden ser
sobreescritos (de lo contrario tendremos un error de compilación)
30
Clases abstractas
34
Extension functions
Agrega funciones a una clase que no podemos modificar de forma directa
35
Por qué utilizar extension functions?
Definimos nuestras extension functions en un lugar que sea fácil de encontrar, por
ejemplo en el mismo archivo de la clase o en una función bien nombrada. 36
Ejemplo de extension function
3.isOdd()
38
Clases data
● Clase especial que existe solo para almacenar datos
println(bookAuthor)
println(bookAuthorYear.third)
● A veces queremos que exista solo una única instancia de una clase
46
Ejemplo de Object/singleton
object Calculator {
fun add(n1: Int, n2: Int): Int {
return n1 + n2
}
}
println(Calculator.add(2,4))
=> 6
47
Companion objects
48
Companion object example
class PhysicsSystem {
companion object WorldConstants {
val gravity = 9.8
val unit = "metric"
fun computeForce(mass: Double, accel: Double): Double {
return mass * accel
}
}
}
println(PhysicsSystem.WorldConstants.gravity)
println(PhysicsSystem.WorldConstants.computeForce(10.0, 10.0)) 49
Organizando nuestro código
50
Único archivo, múltiples entidades
package org.example.game
52
Ejemplos de herencia
org.example.vehicle
Vehicle
org.example.vehicle.moped org.example.vehicle.car
Moped Car
Moped50cc Sedan
Moped100cc Hatchback 53
Modificadores de visibilidad
55