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:
DogiCatsón subclasses d'Animalque sobreescriuen el mètodemakeSound.
-
Polimorfisme en Acció:
- Quan es crida
makeSounden instàncies deDogiCat, 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
