Pregunta

Aquí es Template Method, Java y C ++ pueden implementar fácilmente con función virtual. ¿Qué tal objeto C para implementar este patrón? Cualquier ejemplo en contacto cacao (IOS)?

¿Fue útil?

Solución

Como jer ya se ha señalado, todos los métodos de Objective-C son esencialmente virtual. Es una característica de la lengua, que no acaba de malla con otros lenguajes como C. Una vez dicho esto, los conceptos básicos de la Template Method todavía pueden conseguirse en Objective-C, por "manualmente" subclases obligando a poner en práctica ciertas funciones. Por ejemplo (utilizando la convención en su artículo de Wikipedia relacionado):

@interface Game
{
    int playersCount;
}
- (void)playOneGame:(int)numPlayers;
// "virtual" methods: 
- (void)initializeGame;
- (void)makePlay:(int)player;
- (BOOL)endOfGame;
- (void)printWinner;
@end

@implementation Game
- (void)initializeGame         { NSAssert(FALSE); }
- (void)makePlay:(int player)  { NSAssert(FALSE); }
- (BOOL)endOfGame              { NSAssert(FALSE); return 0; }
- (void)printWinner            { NSAssert(FALSE); }
- (void)playOneGame:(int)numPlayers
{
    //..
}
@end

Las fuerzas de código subclases anteriores de Game para anular los métodos "virtuales" por lanzar una excepción el momento una de las implementaciones de la clase base se llama. En efecto, esto se mueve la prueba de la etapa compilador (como lo sería en C ++ o Java) y en la etapa de ejecución (donde las cosas similares se hacen a menudo en Objective-C).

Si realmente desea aplicar la regla de que las subclases no se les permite reemplazar el método playOneGame:, puede intentar (*) para verificar la correcta aplicación desde dentro del método init:

@implementation Game
...
- (void)init
{
    if ((self = [super init]) == nil) { return nil; }

    IMP my_imp = [Game instanceMethodForSelector:@selector(playOneGame:)];
    IMP imp = [[self class] instanceMethodForSelector:@selector(playOneGame:)];
    NSAssert(imp == my_imp);

    return self;
}
...
@end

(*) Tenga en cuenta que este código no se traduce en una defensa 100% sólido como una roca contra subclases que re-aplicar playOneGame:, ya que la naturaleza misma de Objective-C permitiría a la subclase de instanceMethodForSelector: anulación con el fin de producir la correcta resultado.

Otros consejos

En Objective-C todos los métodos son similares a los métodos virtual C ++.

En Patrón de Objective-C Método plantilla se utiliza cuando usted tiene un esqueleto de un algoritmo pero puede implementarse de diferentes maneras. Método plantilla define los pasos para ejecutar un algoritmo y que pueden proporcionar la aplicación por defecto que pudiera ser común para todas o algunas de las subclases.

Tomemos un ejemplo, pero las primeras imágenes de la imagen

introducir descripción de la imagen aquí

 @interface Worker : NSObject

- (void) doDailyRoutine;
- (void) doWork; // Abstract
- (void) comeBackHome; 
- (void) getsomeSleep;
@end

@implementation Worker

- (void) doDailyRoutine {
  [self doWork];
  [self comeBackHome];
  [self getsomeSleep];
  }

 - (void) doWork { [self doesNotRecognizeSelector:_cmd]; }
 - (void) comeBackHome { [self doesNotRecognizeSelector:_cmd]; }
 - (void) getsomeSleep { [self doesNotRecognizeSelector:_cmd]; }
 // [self doesNotRecognizeSelector:_cmd] it will force to call the subclass          Implementation
@end

@interface Plumber : Worker
@end

@implementation Plumber

- (void) doWork { NSLog(@“Plumber Work"); }

@end
@interface Electrician : Worker

@end

@implementation Electrician

- (void) doWork { NSLog(@“Electrician Work"); }

@end
@interface Cleaner : Worker

@end

@implementation Cleaner

- (void) doWork { NSLog(@“Cleaner Work"); }

@end

En este ejemplo DoWork () es una función abstracta que debe ser implementado por todas las subclases y este patrón se utiliza en gran medida en el cacao Frameworks.

La esperanza que le ayudará a entender el "Template Method".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top