El polimorfisme és un concepte fonamental en la programació orientada a objectes (OOP) que permet que una interfície única sigui utilitzada per diferents tipus d'objectes. En Groovy, com en altres llenguatges orientats a objectes, el polimorfisme permet que una mateixa operació es comporti de manera diferent en funció de l'objecte que la implementa.
Conceptes Clau
-
Polimorfisme de Sobrecàrrega (Overloading):
- Permet definir múltiples mètodes amb el mateix nom però amb diferents signatures (paràmetres).
-
Polimorfisme de Sobreescriptura (Overriding):
- Permet que una subclasse proporcioni una implementació específica d'un mètode que ja està definit en la seva superclasse.
-
Polimorfisme d'Interfície:
- Permet que diferents classes implementin la mateixa interfície, i que els objectes d'aquestes classes puguin ser tractats de manera uniforme a través de la interfície comuna.
Exemples Pràctics
Polimorfisme de Sobrecàrrega
class Calculadora {
int sumar(int a, int b) {
return a + b
}
double sumar(double a, double b) {
return a + b
}
int sumar(int a, int b, int c) {
return a + b + c
}
}
def calc = new Calculadora()
println calc.sumar(1, 2) // Sortida: 3
println calc.sumar(1.5, 2.5) // Sortida: 4.0
println calc.sumar(1, 2, 3) // Sortida: 6Polimorfisme de Sobreescriptura
class Animal {
void ferSoroll() {
println "L'animal fa un soroll"
}
}
class Gos extends Animal {
@Override
void ferSoroll() {
println "El gos borda"
}
}
class Gat extends Animal {
@Override
void ferSoroll() {
println "El gat miola"
}
}
def animals = [new Gos(), new Gat(), new Animal()]
animals.each { it.ferSoroll() }
// Sortida:
// El gos borda
// El gat miola
// L'animal fa un sorollPolimorfisme d'Interfície
interface Volador {
void volar()
}
class Ocell implements Volador {
@Override
void volar() {
println "L'ocell vola"
}
}
class Avio implements Volador {
@Override
void volar() {
println "L'avió vola"
}
}
def voladors = [new Ocell(), new Avio()]
voladors.each { it.volar() }
// Sortida:
// L'ocell vola
// L'avió volaExercicis Pràctics
Exercici 1: Sobrecàrrega de Mètodes
Crea una classe CalculadoraAvançada que tingui mètodes per sumar, restar, multiplicar i dividir nombres enters i decimals. Implementa la sobrecàrrega de mètodes per a cada operació.
Exercici 2: Sobreescriptura de Mètodes
Crea una jerarquia de classes amb una superclasse Vehicle i subclasses Cotxe i Moto. Defineix un mètode moure a la superclasse i sobreescriu-lo a les subclasses per proporcionar implementacions específiques.
Exercici 3: Polimorfisme d'Interfície
Defineix una interfície Instrument amb un mètode tocar. Implementa aquesta interfície en classes Guitarra i Piano. Crea una llista d'instruments i fes que toquin tots els instruments de la llista.
Solucions
Solució a l'Exercici 1
class CalculadoraAvançada {
int sumar(int a, int b) {
return a + b
}
double sumar(double a, double b) {
return a + b
}
int restar(int a, int b) {
return a - b
}
double restar(double a, double b) {
return a - b
}
int multiplicar(int a, int b) {
return a * b
}
double multiplicar(double a, double b) {
return a * b
}
int dividir(int a, int b) {
return a / b
}
double dividir(double a, double b) {
return a / b
}
}
def calc = new CalculadoraAvançada()
println calc.sumar(1, 2) // Sortida: 3
println calc.sumar(1.5, 2.5) // Sortida: 4.0
println calc.restar(5, 3) // Sortida: 2
println calc.restar(5.5, 3.5) // Sortida: 2.0
println calc.multiplicar(2, 3) // Sortida: 6
println calc.multiplicar(2.5, 3.5)// Sortida: 8.75
println calc.dividir(6, 3) // Sortida: 2
println calc.dividir(7.5, 2.5) // Sortida: 3.0Solució a l'Exercici 2
class Vehicle {
void moure() {
println "El vehicle es mou"
}
}
class Cotxe extends Vehicle {
@Override
void moure() {
println "El cotxe es mou"
}
}
class Moto extends Vehicle {
@Override
void moure() {
println "La moto es mou"
}
}
def vehicles = [new Cotxe(), new Moto(), new Vehicle()]
vehicles.each { it.moure() }
// Sortida:
// El cotxe es mou
// La moto es mou
// El vehicle es mouSolució a l'Exercici 3
interface Instrument {
void tocar()
}
class Guitarra implements Instrument {
@Override
void tocar() {
println "La guitarra sona"
}
}
class Piano implements Instrument {
@Override
void tocar() {
println "El piano sona"
}
}
def instruments = [new Guitarra(), new Piano()]
instruments.each { it.tocar() }
// Sortida:
// La guitarra sona
// El piano sonaConclusió
El polimorfisme és una eina poderosa en la programació orientada a objectes que permet escriure codi més flexible i reutilitzable. En Groovy, el polimorfisme es pot aconseguir mitjançant la sobrecàrrega de mètodes, la sobreescriptura de mètodes i la implementació d'interfícies. Aquests conceptes permeten que diferents objectes responguin de manera diferent a les mateixes operacions, facilitant la creació de sistemes més modulars i mantenibles.
Curs de Programació Groovy
Mòdul 1: Introducció a Groovy
Mòdul 2: Sintaxi i Característiques del Llenguatge Groovy
Mòdul 3: Programació Orientada a Objectes en Groovy
Mòdul 4: Característiques Avançades de Groovy
Mòdul 5: Groovy en la Pràctica
- Entrada/Sortida de Fitxers
- Treballant amb XML i JSON
- Accés a Bases de Dades
- Desenvolupament Web amb Groovy
Mòdul 6: Proves i Depuració
Mòdul 7: Ecosistema i Eines de Groovy
- Eina de Construcció Gradle
- Framework de Proves Spock
- Framework Grails
- Altres Llibreries i Eines de Groovy
Mòdul 8: Millors Pràctiques i Temes Avançats
- Estil de Codi i Convencions
- Optimització del Rendiment
- Consideracions de Seguretat
- Concurrència en Groovy
