这是 模板方法模式 ,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模板方法中,当您具有算法的骨架时,使用了模式模式,但可以以不同的方式实现。模板方法定义了执行算法的步骤,并且可以提供所有或某些子类可能常见的默认实现。

让我们举个例子,但先看一下图片

enter image description here

 @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()是一个抽象函数,应由所有子类实现,并且该模式在很大程度上用于可可框架。

希望它将帮助您了解“模板方法模式”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top