El polimorfisme és un concepte fonamental en la programació orientada a objectes (POO) que permet que un objecte es comporti de diferents maneres segons el context. En Objective-C, el polimorfisme es pot aconseguir mitjançant l'ús de mètodes i herència. Aquest tema explorarà com implementar i utilitzar el polimorfisme en Objective-C.
Conceptes Clau
-
Polimorfisme en temps de compilació (sobrecàrrega de mètodes):
- No és suportat directament en Objective-C com en altres llenguatges com C++ o Java.
-
Polimorfisme en temps d'execució (sobreescriptura de mètodes):
- Permet que una subclasse proporcioni una implementació específica d'un mètode que ja està definit en la seva superclasse.
-
Tipus de polimorfisme:
- Polimorfisme de subtipus: Utilitza la herència per permetre que una classe derivada sigui tractada com una instància de la seva classe base.
- Polimorfisme paramètric: No és directament suportat en Objective-C, però es pot aconseguir mitjançant l'ús de generics en Swift.
Exemples Pràctics
Exemple 1: Polimorfisme amb Herència
#import <Foundation/Foundation.h> // Classe base @interface Animal : NSObject - (void)makeSound; @end @implementation Animal - (void)makeSound { NSLog(@"Animal sound"); } @end // Subclasse @interface Dog : Animal @end @implementation Dog - (void)makeSound { NSLog(@"Woof!"); } @end // Subclasse @interface Cat : Animal @end @implementation Cat - (void)makeSound { NSLog(@"Meow!"); } @end int main(int argc, const char * argv[]) { @autoreleasepool { Animal *myDog = [[Dog alloc] init]; Animal *myCat = [[Cat alloc] init]; [myDog makeSound]; // Output: Woof! [myCat makeSound]; // Output: Meow! } return 0; }
Explicació
-
Definició de la Classe Base:
Animal
és la classe base amb un mètodemakeSound
.
-
Definició de les Subclasses:
Dog
iCat
són subclasses d'Animal
que sobreescriuen el mètodemakeSound
.
-
Polimorfisme en Acció:
- Quan es crida
makeSound
en instàncies deDog
iCat
, s'executen les versions sobreescrites dels mètodes.
- Quan es crida
Exercicis Pràctics
Exercici 1: Implementar Polimorfisme
Descripció: Crea una classe base Vehicle
amb un mètode move
. Després, crea dues subclasses Car
i Bicycle
que sobreescriguin el mètode move
per proporcionar una implementació específica.
Solució:
#import <Foundation/Foundation.h> // Classe base @interface Vehicle : NSObject - (void)move; @end @implementation Vehicle - (void)move { NSLog(@"Vehicle is moving"); } @end // Subclasse @interface Car : Vehicle @end @implementation Car - (void)move { NSLog(@"Car is driving"); } @end // Subclasse @interface Bicycle : Vehicle @end @implementation Bicycle - (void)move { NSLog(@"Bicycle is pedaling"); } @end int main(int argc, const char * argv[]) { @autoreleasepool { Vehicle *myCar = [[Car alloc] init]; Vehicle *myBicycle = [[Bicycle alloc] init]; [myCar move]; // Output: Car is driving [myBicycle move]; // Output: Bicycle is pedaling } return 0; }
Exercici 2: Afegir Més Subclasses
Descripció: Afegeix una nova subclasse Motorcycle
a l'exercici anterior i sobreescriu el mètode move
per proporcionar una implementació específica.
Solució:
#import <Foundation/Foundation.h> // Classe base @interface Vehicle : NSObject - (void)move; @end @implementation Vehicle - (void)move { NSLog(@"Vehicle is moving"); } @end // Subclasse @interface Car : Vehicle @end @implementation Car - (void)move { NSLog(@"Car is driving"); } @end // Subclasse @interface Bicycle : Vehicle @end @implementation Bicycle - (void)move { NSLog(@"Bicycle is pedaling"); } @end // Nova subclasse @interface Motorcycle : Vehicle @end @implementation Motorcycle - (void)move { NSLog(@"Motorcycle is revving"); } @end int main(int argc, const char * argv[]) { @autoreleasepool { Vehicle *myCar = [[Car alloc] init]; Vehicle *myBicycle = [[Bicycle alloc] init]; Vehicle *myMotorcycle = [[Motorcycle alloc] init]; [myCar move]; // Output: Car is driving [myBicycle move]; // Output: Bicycle is pedaling [myMotorcycle move]; // Output: Motorcycle is revving } return 0; }
Errors Comuns i Consells
-
No sobreescriure correctament els mètodes:
- Assegura't que el mètode de la subclasse tingui la mateixa signatura que el mètode de la superclasse.
-
No cridar el mètode de la superclasse:
- Si necessites cridar el mètode de la superclasse dins del mètode sobreescrit, utilitza
[super methodName]
.
- Si necessites cridar el mètode de la superclasse dins del mètode sobreescrit, utilitza
-
Confusió entre polimorfisme i sobrecàrrega:
- Recorda que Objective-C no suporta la sobrecàrrega de mètodes com altres llenguatges. El polimorfisme en Objective-C es basa principalment en la sobreescriptura de mètodes.
Resum
El polimorfisme és una característica poderosa de la programació orientada a objectes que permet que les subclasses proporcionin implementacions específiques de mètodes definits en una superclasse. En Objective-C, això es fa mitjançant la sobreescriptura de mètodes. Aquest concepte permet escriure codi més flexible i reutilitzable, ja que les instàncies de diferents subclasses poden ser tractades de manera uniforme a través de la seva classe base.
Curs de Programació en Objective-C
Mòdul 1: Introducció a Objective-C
- Introducció a Objective-C
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsiques
- Tipus de Dades i Variables
- Operadors i Expressions
Mòdul 2: Flux de Control
Mòdul 3: Funcions i Mètodes
- Definició i Crida de Funcions
- Paràmetres de Funció i Valors de Retorn
- Sintaxi de Mètodes en Objective-C
- Mètodes de Classe i d'Instància
Mòdul 4: Programació Orientada a Objectes
Mòdul 5: Gestió de Memòria
- Introducció a la Gestió de Memòria
- Comptatge Automàtic de Referències (ARC)
- Retenció i Alliberament Manual
- Millors Pràctiques de Gestió de Memòria
Mòdul 6: Temes Avançats
Mòdul 7: Treballant amb Dades
- Gestió d'Arxius
- Serialització i Deserialització
- Conceptes Bàsics de Xarxes
- Treballant amb JSON i XML
Mòdul 8: Desenvolupament d'Interfícies d'Usuari
- Introducció a UIKit
- Vistes i Controladors de Vista
- Disseny Automàtic
- Gestió de l'Entrada de l'Usuari