En aquest mòdul, explorarem com F# maneja la programació orientada a objectes (OOP). Tot i que F# és principalment un llenguatge funcional, també ofereix suport per a OOP, permetent la creació de classes, objectes, herència i interfícies. Aquest enfocament híbrid permet als desenvolupadors utilitzar el millor de tots dos mons.
Continguts
Introducció a les Classes i Objectes
Les classes són plantilles per crear objectes, que encapsulen dades i comportaments relacionats. Els objectes són instàncies de classes que poden tenir estats i comportaments propis.
Definició de Classes
En F#, les classes es defineixen utilitzant la paraula clau type seguida del nom de la classe i el cos de la classe.
Explicació
type Person(name: string, age: int) =: Defineix una classe anomenadaPersonamb dos paràmetres de constructor:nameiage.member this.Name = name: Defineix una propietatNameque retorna el valor dename.member this.Age = age: Defineix una propietatAgeque retorna el valor deage.
Creació d'Objectes
Per crear una instància d'una classe, simplement cridem el constructor de la classe amb els arguments necessaris.
Explicació
let person1 = Person("Alice", 30): Crea un objecteperson1de la classePersonamb el nom "Alice" i l'edat 30.printfn "Name: %s, Age: %d" person1.Name person1.Age: Imprimeix les propietatsNameiAgede l'objecteperson1.
Mètodes i Propietats
Les classes poden tenir mètodes (funcions) i propietats (valors associats a l'objecte).
type Person(name: string, age: int) =
member this.Name = name
member this.Age = age
member this.Greet() = printfn "Hello, my name is %s." this.NameExplicació
member this.Greet() = printfn "Hello, my name is %s." this.Name: Defineix un mètodeGreetque imprimeix un missatge de salutació utilitzant la propietatName.
Constructors
Els constructors inicialitzen els objectes quan es creen. F# permet definir constructors primaris i secundaris.
Constructor Primari
El constructor primari es defineix a la mateixa línia que el nom de la classe.
Constructor Secundari
Els constructors secundaris es defineixen dins del cos de la classe utilitzant la paraula clau new.
type Person(name: string, age: int) =
member this.Name = name
member this.Age = age
new() = Person("Unknown", 0)Explicació
new() = Person("Unknown", 0): Defineix un constructor secundari que crea una instància dePersonamb valors per defecte.
Herència
F# permet que una classe hereti d'una altra classe utilitzant la paraula clau inherit.
type Person(name: string, age: int) =
member this.Name = name
member this.Age = age
type Student(name: string, age: int, studentId: string) =
inherit Person(name, age)
member this.StudentId = studentIdExplicació
inherit Person(name, age): La classeStudenthereta dePersoni passa els paràmetresnameiageal constructor dePerson.member this.StudentId = studentId: Defineix una propietatStudentIdespecífica de la classeStudent.
Interfícies
Les interfícies defineixen contractes que les classes poden implementar. En F#, les interfícies es defineixen amb la paraula clau interface.
type IGreet =
abstract member Greet: unit -> unit
type Person(name: string) =
interface IGreet with
member this.Greet() = printfn "Hello, my name is %s." nameExplicació
type IGreet = abstract member Greet: unit -> unit: Defineix una interfícieIGreetamb un mètode abstracteGreet.interface IGreet with member this.Greet() = printfn "Hello, my name is %s." name: La classePersonimplementa la interfícieIGreet.
Exercicis Pràctics
Exercici 1: Definir una Classe
Defineix una classe Car amb les propietats Make, Model i Year. Afegeix un mètode DisplayInfo que imprimeixi la informació del cotxe.
type Car(make: string, model: string, year: int) =
member this.Make = make
member this.Model = model
member this.Year = year
member this.DisplayInfo() = printfn "Make: %s, Model: %s, Year: %d" this.Make this.Model this.YearExercici 2: Crear una Instància i Utilitzar Mètodes
Crea una instància de la classe Car i crida el mètode DisplayInfo.
Exercici 3: Herència
Defineix una classe ElectricCar que hereti de Car i afegeixi una propietat BatteryLife.
type ElectricCar(make: string, model: string, year: int, batteryLife: int) =
inherit Car(make, model, year)
member this.BatteryLife = batteryLife
member this.DisplayBatteryLife() = printfn "Battery Life: %d hours" this.BatteryLifeSolucions
Solució Exercici 1
type Car(make: string, model: string, year: int) =
member this.Make = make
member this.Model = model
member this.Year = year
member this.DisplayInfo() = printfn "Make: %s, Model: %s, Year: %d" this.Make this.Model this.YearSolució Exercici 2
Solució Exercici 3
type ElectricCar(make: string, model: string, year: int, batteryLife: int) =
inherit Car(make, model, year)
member this.BatteryLife = batteryLife
member this.DisplayBatteryLife() = printfn "Battery Life: %d hours" this.BatteryLifeConclusió
En aquest tema, hem après com definir classes i objectes en F#, com crear instàncies, definir mètodes i propietats, utilitzar constructors, implementar herència i interfícies. Aquestes habilitats són fonamentals per treballar amb la programació orientada a objectes en F#. En el proper tema, explorarem com combinar la programació funcional i orientada a objectes en F#.
Curs de Programació en F#
Mòdul 1: Introducció a F#
Mòdul 2: Conceptes Bàsics
- Tipus de Dades i Variables
- Funcions i Immutabilitat
- Coincidència de Patrons
- Col·leccions: Llistes, Matrius i Seqüències
Mòdul 3: Programació Funcional
Mòdul 4: Estructures de Dades Avançades
Mòdul 5: Programació Orientada a Objectes en F#
- Classes i Objectes
- Herència i Interfícies
- Barreja de Programació Funcional i Orientada a Objectes
- Mòduls i Espais de Noms
Mòdul 6: Programació Asíncrona i Paral·lela
- Fluxos de Treball Asíncrons
- Biblioteca de Tasques Paral·leles
- MailboxProcessor i Agents
- Patrons de Concurrència
Mòdul 7: Accés i Manipulació de Dades
Mòdul 8: Proves i Depuració
- Proves Unitàries amb NUnit
- Proves Basades en Propietats amb FsCheck
- Tècniques de Depuració
- Perfilat de Rendiment
