En este módulo, exploraremos cómo F# maneja la programación orientada a objetos (OOP). Aunque F# es principalmente un lenguaje funcional, también soporta características de OOP, lo que permite a los desarrolladores aprovechar lo mejor de ambos mundos.

Conceptos Clave

  1. Clases: Definición y uso de clases en F#.
  2. Objetos: Creación e instanciación de objetos.
  3. Propiedades y Métodos: Cómo definir y utilizar propiedades y métodos en una clase.
  4. Constructores: Inicialización de objetos con constructores.
  5. Herencia: Extender clases y reutilizar código.

Clases en F#

Definición de una Clase

En F#, una clase se define utilizando la palabra clave type. Aquí hay un ejemplo básico de una clase Persona:

type Persona(nombre: string, edad: int) =
    member this.Nombre = nombre
    member this.Edad = edad
    member this.Saludar() = printfn "Hola, mi nombre es %s y tengo %d años." this.Nombre this.Edad

Explicación del Código

  • type Persona(nombre: string, edad: int) =: Define una clase llamada Persona con dos parámetros de constructor: nombre y edad.
  • member this.Nombre = nombre: Define una propiedad Nombre que devuelve el valor del parámetro nombre.
  • member this.Edad = edad: Define una propiedad Edad que devuelve el valor del parámetro edad.
  • member this.Saludar() = ...: Define un método Saludar que imprime un saludo utilizando las propiedades Nombre y Edad.

Creación de Objetos

Para crear una instancia de la clase Persona, simplemente llamamos al constructor de la clase:

let persona1 = Persona("Juan", 30)
persona1.Saludar()

Propiedades y Métodos

Las propiedades y métodos en F# se definen utilizando la palabra clave member. Aquí hay un ejemplo más detallado:

type Coche(marca: string, modelo: string, año: int) =
    member this.Marca = marca
    member this.Modelo = modelo
    member this.Año = año
    member this.Descripcion() = 
        printfn "Este coche es un %s %s del año %d." this.Marca this.Modelo this.Año

Constructores

F# permite definir constructores adicionales utilizando la palabra clave new. Aquí hay un ejemplo:

type Rectangulo(ancho: float, alto: float) =
    member this.Ancho = ancho
    member this.Alto = alto
    member this.Area() = this.Ancho * this.Alto

    new() = Rectangulo(1.0, 1.0) // Constructor por defecto

Herencia

F# soporta herencia utilizando la palabra clave inherit. Aquí hay un ejemplo de cómo extender una clase:

type Animal(nombre: string) =
    member this.Nombre = nombre
    member this.Hablar() = printfn "%s hace un sonido." this.Nombre

type Perro(nombre: string) =
    inherit Animal(nombre)
    member this.Ladrar() = printfn "%s ladra." this.Nombre

Ejemplo Completo

Aquí hay un ejemplo completo que combina todos los conceptos anteriores:

type Persona(nombre: string, edad: int) =
    member this.Nombre = nombre
    member this.Edad = edad
    member this.Saludar() = printfn "Hola, mi nombre es %s y tengo %d años." this.Nombre this.Edad

type Empleado(nombre: string, edad: int, puesto: string) =
    inherit Persona(nombre, edad)
    member this.Puesto = puesto
    member this.Trabajar() = printfn "%s está trabajando como %s." this.Nombre this.Puesto

let empleado1 = Empleado("Ana", 28, "Ingeniera de Software")
empleado1.Saludar()
empleado1.Trabajar()

Ejercicios Prácticos

Ejercicio 1: Definir una Clase

Define una clase Libro con las siguientes propiedades y métodos:

  • Propiedades: Titulo, Autor, Paginas
  • Método: Descripcion que imprime una descripción del libro.

Solución

type Libro(titulo: string, autor: string, paginas: int) =
    member this.Titulo = titulo
    member this.Autor = autor
    member this.Paginas = paginas
    member this.Descripcion() = 
        printfn "El libro '%s' escrito por %s tiene %d páginas." this.Titulo this.Autor this.Paginas

let libro1 = Libro("1984", "George Orwell", 328)
libro1.Descripcion()

Ejercicio 2: Herencia

Define una clase Vehiculo con una propiedad Velocidad y un método Mover. Luego, define una clase Coche que herede de Vehiculo y añada una propiedad Marca.

Solución

type Vehiculo(velocidad: int) =
    member this.Velocidad = velocidad
    member this.Mover() = printfn "El vehículo se mueve a %d km/h." this.Velocidad

type Coche(velocidad: int, marca: string) =
    inherit Vehiculo(velocidad)
    member this.Marca = marca
    member this.Descripcion() = printfn "El coche de marca %s se mueve a %d km/h." this.Marca this.Velocidad

let coche1 = Coche(120, "Toyota")
coche1.Mover()
coche1.Descripcion()

Conclusión

En esta sección, hemos aprendido cómo definir y utilizar clases y objetos en F#. Hemos cubierto la creación de clases, instanciación de objetos, definición de propiedades y métodos, uso de constructores y herencia. Estos conceptos son fundamentales para aprovechar las capacidades de programación orientada a objetos en F#.

En el próximo módulo, exploraremos cómo mezclar programación funcional y orientada a objetos para crear aplicaciones más robustas y flexibles.

Curso de Programación en F#

Módulo 1: Introducción a F#

Módulo 2: Conceptos Básicos

Módulo 3: Programación Funcional

Módulo 4: Estructuras de Datos Avanzadas

Módulo 5: Programación Orientada a Objetos en F#

Módulo 6: Programación Asíncrona y Paralela

Módulo 7: Acceso y Manipulación de Datos

Módulo 8: Pruebas y Depuración

Módulo 9: Temas Avanzados

Módulo 10: Aplicaciones Prácticas

© Copyright 2024. Todos los derechos reservados