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.