- 1

Fundamentos de Kotlin: Variables, funciones y estructuras de datos
01:47 - 2

Instalación y configuración de IntelliJ IDEA para Kotlin
11:16 - 3

Creación de proyecto Kotlin en IntelliJ y primer programa
13:47 - 4

Variables y tipos de datos básicos en Kotlin
20:58 - 5

Operadores aritméticos y módulo en Kotlin
14:28 - 6

Operadores lógicos AND, OR y NOT en programación
20:51 - 7

Manejo de valores nulos y operadores seguros en Kotlin
12:30 - 8

Lectura de datos por consola con readLine() en Kotlin
14:49 quiz de Fundamentos de Kotlin
Clases abstractas y métodos abstractos en Kotlin
Clase 27 de 35 • Curso de Kotlin
Contenido del curso
- 9

Creación de funciones en Kotlin para organizar código
20:21 - 10

Condicionales en Kotlin: if/else
17:14 - 11

Estructura when de Kotlin para múltiples condiciones
17:44 - 12

Arrays y listas mutables en Kotlin: creación y manipulación
18:19 - 13

Listas inmutables y mutables en Kotlin
10:13 - 14

Ciclos for, while y do while en Kotlin para iterar colecciones
18:57 quiz de Contro de Flujo y Funciones
- 15

Creación de clases y objetos en Kotlin
17:05 - 16

Getters y setters en Kotlin: validación y propiedades calculadas
14:38 - 17

Dataclases en Kotlin: ventajas sobre clases normales
16:46 - 18

Enums en Kotlin: Constantes organizadas para casos específicos
20:33 - 19

Manejo de excepciones con Try Catch Finally en Kotlin
19:40 quiz de Programación Orientada a Objetos en Kotlin
- 20

Extension functions en Kotlin para ampliar clases existentes
18:14 - 21

Funciones de alto orden y lambdas en Kotlin
22:37 - 22

Uso de lambdas y funciones de alto orden en arrays y colecciones
10:05 - 23

Scope functions de Kotlin: let, apply y run para manipular objetos
15:30 - 24

Funciones with y also en Kotlin para operaciones múltiples
11:09 - 25

Modificadores de visibilidad y encapsulamiento en Kotlin
17:06 - 26

Interfaces y patrón repository en Kotlin para gestión de datos
20:00 quiz de Características Avanzadas de Kotlin
- 31

Creación de modelos y repositorios para simulador de emails en Kotlin
22:57 - 32

Creación de clase service para coordinar repositorios en Kotlin
18:19 - 33

Implementación de funciones avanzadas del servicio Inbox en Kotlin
21:19 - 34

Interfaz por consola para gestión de correos en Kotlin
16:50 - 35

Pruebas de funcionalidades de correo en Kotlin
07:32
Las abstract classes y las interfaces son dos conceptos clave en la programación orientada a objetos que permiten estructurar código de manera eficiente. En este contenido profundizamos en entender qué son estas abstract classes, en qué se diferencian de las interfaces y en qué situaciones es recomendable utilizar cada una para lograr un código más limpio y escalable.
¿Qué es una abstract class y cómo funciona?
Una abstract class es una clase especial en programación que define métodos y variables para que otras clases, mediante la herencia, implementen sus funcionalidades. A diferencia de las clases comunes, estas no pueden instanciarse directamente, ya que contienen métodos abstractos y variables abstractas que deben ser obligatoriamente definidos por las subclases que heredan de ellas.
- La declaración se realiza con la palabra reservada abstract.
- Garantiza que cualquier clase que la extienda debe implementar sus métodos abstractos definidos en la clase base.
¿Cómo declarar una abstract class?
Para declarar una abstract class, sigue el modelo siguiente:
abstract class BaseEmailRepository {
abstract fun save(email: String)
}
Cuando otra clase extiende esta clase abstracta, debe implementar el método.
¿En qué se diferencian abstract classes e interfaces?
La principal diferencia radica en cómo establecen relaciones entre las clases que las implementan:
- Las abstract classes usan herencia, creando relaciones directas entre una clase padre y sus subclases. Esto implica una jerarquía y dependencia.
- Las interfaces usan composición y no generan esta jerarquía. Permiten crear pequeñas funcionalidades encapsuladas y mantener clases más independientes.
Al decidir entre ellas, considera:
- Usar abstract class si todas las variables o métodos se utilizarán frecuentemente en subclases.
- Usar interfaces para pequeños contratos flexibles que no necesariamente requerirán todas sus variables o métodos en todas las implementaciones.
¿Qué implica el uso de herencia versus composición?
La herencia puede llevar a una acumulación de métodos y variables innecesarias en algunas clases hijas, mientras que la composición mediante interfaces permite un diseño modular y más liviano.
De este modo, interfaces ayudan a mantener un código ordenado y limpio, facilitando futuras modificaciones o ampliaciones.
Ejemplo práctico con abstract class
Aquí tienes un ejemplo práctico que ilustra cómo usar abstract class:
abstract class BaseEmailNotifier {
abstract fun notify(email: String)
}
class ConsoleNotifier : BaseEmailNotifier() {
override fun notify(email: String) {
println("Email recibido: $email")
}
}
fun main() {
val notifier = ConsoleNotifier()
notifier.notify("ejemplo@correo.com")
}
Recuerda, implementas la función notify obligatoriamente en la subclase cuando usas abstract class, algo similar a la implementación requerida por una interfaz, pero mediante herencia.
¿Cuándo elegir abstract class sobre interfaces?
Elige abstract class si: - Necesitas mantener y extender una lógica común de manera sencilla a través de múltiples implementaciones relacionadas por jerarquía.
Opta por interfaces cuando: - Prefieres flexibilidad y modularidad, evitando relaciones jerárquicas rígidas entre las clases que implementan funcionalidades similares.