En algunas situaciones tenemos métodos y propiedades comunes a un conjunto de clases, podemos agrupar dichos métodos y propiedades en una clase abstracta.
Hay una sintaxis especial en Kotlin para indicar que una clase es abstracta.
No se pueden definir objetos de una clase abstracta y seguramente será heredada por otras clases de las que si podremos definir objetos.
Declarar una clase abstracta que represente una Operación. Definir en la misma tres propiedades valor1, valor2 y resultado, y dos métodos: calcular e imprimir.
Plantear dos clases llamadas Suma y Resta que hereden de la clase Operación.
abstract class Operacion(val valor1: Int, val valor2: Int) {
protected var resultado: Int = 0
abstract fun operar()
fun imprimir() {
println("Resultado: $resultado")
}
}
class Suma(valor1: Int, valor2: Int): Operacion(valor1, valor2) {
override fun operar() {
resultado = valor1 + valor2
}
}
class Resta(valor1: Int, valor2: Int): Operacion(valor1, valor2) {
override fun operar() {
resultado = valor1 - valor2
}
}
fun main(parametro: Array<String>) {
val suma1 = Suma(10, 4)
suma1.operar()
suma1.imprimir()
val resta1 = Resta(20, 5)
resta1.operar()
resta1.imprimir()
}
Una clase abstracta se la declara antecediendo la palabra clave abstract a la palabra clave class:
abstract class Operacion(val valor1: Int, val valor2: Int) {
Podemos definir propiedades que serán heredables:
protected var resultado: Int = 0
Podemos declarar métodos abstractos que obligan a las clases que heredan de esta a su implementación (esto ayuda a unificar las funcionalidades de todas sus subclases, tiene sentido que toda clase que herede de la clase Operación implemente un método operar):
abstract fun operar()
Una clase abstracta puede tener también métodos concretos, es decir implementados:
fun imprimir() {
println("Resultado: $resultado")
}
La sintaxis para declarar que una clase hereda de una clase abstracta es lo mismo que vimos en el concepto anterior:
class Suma(valor1: Int, valor2: Int): Operacion(valor1, valor2) {
Lo que si es obligatorio implementar el método abstracto operar, en caso que no se lo haga aparece un error sintáctico:
override fun operar() {
resultado = valor1 + valor2
}
En la función main podemos definir objetos de la clave Suma y Resta, pero no podemos definir objetos de la clase Operacion ya que la misma es abstracta:
fun main(parametro: Array<String>) {
val suma1 = Suma(10, 4)
suma1.operar()
suma1.imprimir()
val resta1 = Resta(20, 5)
resta1.operar()
resta1.imprimir()
}
Proyecto141
abstract class Cuenta(val titular: String, val monto: Double) {
open fun imprimir() {
println("Titular: $titular")
println("Monto: $monto")
}
}
class CajaAhorro(titular: String, monto: Double): Cuenta(titular, monto) {
override fun imprimir() {
println("Cuenta de caja de ahorro")
super.imprimir()
}
}
class PlazoFijo(titular: String, monto: Double, val plazo: Int, val interes: Double): Cuenta(titular, monto) {
override fun imprimir() {
println("Cuenta de plazo fijo")
println("Plazo en dias: $plazo")
println("Intereses: $interes")
val ganancia = monto * interes / 100
println("Importe del interes: $ganancia")
super.imprimir()
}
}
fun main(parametro: Array<String>) {
val cajaAhorro1 = CajaAhorro("juan", 10000.0)
cajaAhorro1.imprimir()
val plazoFijo1 = PlazoFijo("Ana", 5000.0, 30, 1.23)
plazoFijo1.imprimir()
}