Objective-C - шаблон шаблонов шаблонов?
Итак, я читал о методах шаблонов на Objective-C, и я пытаюсь понять, что в них такого особенного. Насколько я понимаю, любой метод в базовом классе может быть перегружен, и супер можно вызвать? Итак, метод шаблона - это нечто большее, чем переопределение метода в базовом классе?
Если я ошибаюсь, можете ли вы объяснить, что такое шаблон-метод-шаблон, и можете ли вы привести пример?
Ответы
Ответ 1
Да, шаблон шаблона немного больше, чем просто переопределение метода в базовом классе.
Шаблон шаблона может использоваться, когда контур алгоритма определен конкретно, однако этапы алгоритма остаются абстрактными. Это означает, что этапы могут быть реализованы по-разному. Но общий план алгоритма не ожидается.
Пример, который я только что создал "на лету":
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 можно найти здесь .
Ответ 2
Я подумал, что должен дать более подробный ответ Objective-C. Вы можете прочитать о методе шаблона, который используется в Cocoa на яблях Cocoa Страницы шаблонов проектирования. Примером этого является метод шаблона drawRect:
. Как и другие методы шаблонов, вы никогда не вызываете методы шаблонов непосредственно сами. Он называется setNeedsDisplay
. Дело в том, чтобы позволить платформе оптимизировать чертеж. Если вы сами вызываете drawRect:
самостоятельно, вы можете сделать многократные повторы повторно.
На самом деле вам, вероятно, следует попытаться сделать каждый метод, который вы хотите переопределить в подклассе методом шаблона. Это уменьшает проблему, зная, следует ли вызывать реализацию базового класса при переопределении и упрощении отладки. Вы можете просто поставить точку останова в базовом классе, а не все переопределенные методы в подклассах.
Ответ 3
Из моего понимания любой метод в базовом классе может быть перегружен и супер можно вызвать? Итак, метод шаблона - это нечто большее, чем переопределение метода в базовом классе?
Да, это намного больше, чем просто переопределение метода базового класса. Методы шаблонов - это способ реализации алгоритма, в котором некоторые шаги зависят от подкласса. Например, рассмотрим метод в базе, который имеет три основных этапа: f1, f2 и f3. Каждый шаг содержит несколько утверждений. Здесь f1 и f3 одинаковы во всех подклассах, но f2 зависит от подкласса. Так что же здесь делать? Вы можете переопределить весь метод в подписях, копирующих утверждения f1 и f3, но это отходы. Таким образом, вы предоставляете только f2 в подклассе. И таким образом вы определяете алгоритм (выполните f1, затем выполните f2, затем выполните f3) в базовом классе, но предоставьте перехватывающие крючки для подклассов (f2). Обратите внимание, что метод шаблона в базовом классе является окончательным, поэтому подкласс не может изменить алгоритм, например. он не может изменить порядок f1, f2 и f3, ни один подкласс не может опустить шаги f1, f3.
Короче говоря, шаблон Templates Methods не только переопределяет, но и использует наследование для обработки определенных ситуаций. Это не Obj-C, и я не могу предоставить вам что-то конкретное для Obj-C. Чтобы получить общее представление об этом шаблоне, я рекомендую следующее:
И есть также тонны учебников/статей в Интернете. Основная идея не зависит от Obj-C.