什么是“模板方法模式””在Cocoa与对象C? (语言比较思维)

这是模板方法模式,Java和C ++可以通过虚函数轻松实现。对象C如何实现这种模式?可可触摸(iOS)中的任何示例?     
已邀请:
正如jer已经指出的那样,所有Objective-C方法基本上都是虚拟的。它是该语言的一个特征,与其他类C语言不完全相似。话虽这么说,模板方法模式的基础仍然可以在Objective-C中实现,通过“手动”强制子类来实现某些功能。例如(使用链接的维基百科文章中的约定):
@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
上面的代码强制
Game
的子类通过在调用其中一个基类实现时抛出异常来覆盖“虚拟”方法。实际上,这会将测试从编译器阶段(如在C ++或Java中)移动到运行时阶段(其中类似的事情通常在Objective-C中完成)。 如果您确实要强制执行不允许子类覆盖
playOneGame:
方法的规则,则可以尝试(*)从
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
(*)请注意,此代码不会导致对重新实现
playOneGame:
的子类的100%坚如磐石的防御,因为Objective-C的本质将允许子类覆盖
instanceMethodForSelector:
以产生正确的结果。     
在Objective-C中,所有方法都类似于C ++
virtual
方法。     
在Objective-C模板中使用方法模式当您具有算法的骨架但可以以不同方式实现时。 Template方法定义了执行算法的步骤,它可以提供可能对所有或部分子类通用的默认实现。 让我们举一个例子,但首先看图片
 @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
  在这个例子中,dowork()是一个抽象函数,它应该由所有子类实现,并且这个模式主要用在Cocoa框架中。 希望它能帮助您理解“模板方法模式”。     

要回复问题请先登录注册