Что такое «шаблон метода шаблона» в какао с объектом C? (Сравнение языка мышление)

StackOverflow https://stackoverflow.com/questions/4551109

Вопрос

Вот шаблон метода метода , Java и C ++ могут легко реализовать это с помощью виртуальной функции. Как насчет объекта C для реализации этого шаблона? Любой пример в какао Touch (iOS)?

Это было полезно?

Решение

В качестве jer уже отметил, что все методы объективных 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

(*) Обратите внимание, что этот код не приводит к 100% -ную защиту в скале от подклассов, которые повторно внедряют playOneGame:, поскольку сама природа объектива-C позволила бы подклассу переопределить instanceMethodForSelector: Чтобы получить правильный результат.

Другие советы

В Objective-C все методы сродни C ++ virtual методы

В Moadive-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