Qual è il “metodo motivo template” in cacao con Object C? (Confronto pensiero Language)
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)?
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
@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".