可可用对象C的可可中的“模板方法模式”是什么? (语言比较思维)
题
这是 模板方法模式 ,Java和C ++可以通过虚拟功能轻松实现它。对象C实现此模式怎么样?可可触摸(iOS)中有什么例子吗?
解决方案
作为 杰 已经指出,所有Objective-C方法本质上都是虚拟的。它是该语言的功能,与其他类似C的语言并不完全融合。话虽如此,模板方法模式的基础知识仍然可以通过“手动”迫使子类实施某些功能来实现。例如(使用链接的Wikipedia文章中的约定):
@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
(*)请注意,此代码不会导致100%的岩石固定防御对子类的防御 playOneGame:
, ,因为Objective-C的本质将使子类覆盖 instanceMethodForSelector:
为了产生正确的结果。
其他提示
在Objective-C中,所有方法类似于C ++ virtual
方法。
在Objective-C模板方法中,当您具有算法的骨架时,使用了模式模式,但可以以不同的方式实现。模板方法定义了执行算法的步骤,并且可以提供所有或某些子类可能常见的默认实现。
让我们举个例子,但先看一下图片
@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()是一个抽象函数,应由所有子类实现,并且该模式在很大程度上用于可可框架。
希望它将帮助您了解“模板方法模式”。
不隶属于 StackOverflow