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

  1. 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.
  2. 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.
  3. 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ó

  1. Definició de la Classe Base:

    • Animal és la classe base amb un mètode makeSound.
  2. Definició de les Subclasses:

    • Dog i Cat són subclasses d'Animal que sobreescriuen el mètode makeSound.
  3. Polimorfisme en Acció:

    • Quan es crida makeSound en instàncies de Dog i Cat, s'executen les versions sobreescrites dels mètodes.

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

  1. 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.
  2. 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].
  3. 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.

© Copyright 2024. Tots els drets reservats