Domanda

Ecco Template Method modello , Java e C ++ possono implementare facilmente con funzione virtuale. Che ne dite di Object C per implementare questo modello? Qualsiasi esempio in contatto cacao (iOS)?

È stato utile?

Soluzione

Come jer già sottolineato, tutti i metodi Objective-C sono essenzialmente virtuale. Si tratta di una caratteristica del linguaggio che non abbastanza in rete con altri linguaggi C-like. Detto, le basi del modello metodo modello possono essere ancora realizzati in Objective-C, da "manualmente" sottoclassi costringendo per implementare alcune funzioni. Per esempio (utilizzando la convenzione nel vostro articolo Wikipedia linked):

@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

I suddetti forze codice sottoclassi di Game sovrascrivere i metodi "virtuali" da un'eccezione momento una delle implementazioni classe base viene chiamato. In effetti, questo si muove la prova dalla fase compilatore (come sarebbe in C ++ o Java) e nella fase di esecuzione (dove le cose simili sono spesso fatto in Objective-C).

Se davvero desidera applicare la regola che sottoclassi non sono autorizzati a eseguire l'override del metodo playOneGame:, è possibile tentare (*) per verificare la corretta applicazione da dentro il metodo 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

(*) Si noti che questo codice non si traduca in una difesa solida al 100% contro sottoclassi che re-implementare playOneGame:, dal momento che la natura stessa di Objective-C permetterebbe la sottoclasse di esclusione instanceMethodForSelector: al fine di produrre la corretta risultato.

Altri suggerimenti

In Objective-C tutti i metodi sono simili a C ++ metodi virtual.

In Objective C-pattern Template Method viene usato quando si ha uno scheletro di un algoritmo, ma può essere implementato in diversi modi. Metodo modello definisce la procedura per eseguire un algoritmo ed è in grado di fornire implementazione di default che potrebbe essere comune per tutti o alcuni dei sottoclassi.

Facciamo un esempio, ma prima guardare il quadro

entrare descrizione dell'immagine qui

 @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

In questo esempio DoWork () è una funzione astratta che dovrebbe essere attuato da tutte le sottoclassi e questo modello è ampiamente utilizzato in Cocoa quadri.

La speranza che vi aiuterà a capire il "Pattern Template Method".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top