Да, шаблон шаблона немного больше, чем просто переопределение метода в базовом классе.
Шаблон шаблона может использоваться, когда схема алгоритма определена конкретно, однако шаги алгоритмаоставил аннотацию.Это означает, что шаги могут быть реализованы по-разному.Но общая схема алгоритма, как ожидается, не изменится.
Пример, который я только что создал на лету:
class Life {
public method goThroughTheDay(){
goToWork();
eatLunch();
comeBackHome();
programABitMore();
}
abstract method goToWork();
abstract method eatLunch();
abstract method comeBackHome();
abstract method programABitMore();
}
class GoodLife extends Life {
//override all the abstract methods here
}
//The client application
Life life = new GoodLife();
life.goThroughTheDay();
В принципе, ожидаемый способ работы днявниз конкретно определен в классе Life.Однако, детали процесса заботятся подклассом (то есть. GoodLife).Класс GoodLife будет реализовывать шаги совершенно иначе, чем возможный класс ToughLife.
Есть несколько вариаций этого паттерна;например, некоторые из шагов также могут быть конкретно определены.В этом примере eatLunch () может быть конкретно определен в классе Life;Это означает, что подклассы не должны изменять это поведение.
Шаблон имеет большой смысл, если у вас есть относительно сложный алгоритм, который может быть реализован различными способами.
============================================
Я как-то пропустилрасстаться с Objective-C в моем ответе.Вот как это будет выглядеть в Objective-C:
@interface Life : NSObject
- (void) goThroughTheDay;
- (void) goToWork; // Abstract
- (void) eatLunch; // Abstract
- (void) comeBackHome; // Abstract
- (void) programABitMore; // Abstract
@end
@implementation Life
- (void) goThroughTheDay {
[self goToWork];
[self eatLunch];
[self comeBackHome];
[self programABitMore];
}
- (void) goToWork { [self doesNotRecognizeSelector:_cmd]; }
- (void) eatLunch { [self doesNotRecognizeSelector:_cmd]; }
- (void) comeBackHome { [self doesNotRecognizeSelector:_cmd]; }
- (void) programABitMore { [self doesNotRecognizeSelector:_cmd]; }
@end
@interface GoodLife : Life
@end
@implementation GoodLife
- (void) goToWork { NSLog(@"Good Work"); }
- (void) eatLunch { NSLog(@"Good Lunch"); }
- (void) comeBackHome { NSLog(@"Good Comeback"); }
- (void) programABitMore { NSLog(@"Good Programming"); }
@end
Objective-C не имеет встроенной поддержки абстрактных классов, поэтому я обошел ее, используя метод doesNotRecognizeSelector:
.Гораздо больше подробностей об абстрактных классах и Objective-C можно найти здесь .