2015-06-28 4 views
2

Я прихожу с Java, и я пересматриваю книгу Head First Design Patterns (которая является библией для шаблонов проектирования в соответствии с некоторыми разработчиками). Я пытаюсь воссоздать Duck Simulator из книги перевод Java на Obj-C, и это то, что я до сих пор:Шаблон проектирования стратегии в Objective-C

https://github.com/ZnelArts/IOSDesignPatterns/tree/master/DesignPatterns/Strategy/DuckSimulator

Этот симулятор использует шаблон стратегии, которая применяется с использованием протоколов. У меня есть 2 проблемы с моей реализацией:

1- У меня не может быть класса Duck абстрактным, как в версии Java, на версии Java метод «display()» является абстрактным и должен быть реализован детьми классы.

2- Я должен был открыть свойства класса Duck, чтобы классы детей имели к ним доступ, это не похоже на Java, где частные свойства могут быть видны дочерними классами.

Что было бы идеальным дизайном для этого решения?

ответ

1

Вы находитесь на правильном пути, и вы хорошо определили ограничения языка Objective-C в своем упражнении.

Objective-C не хватает инструментов для:

1. Имея абстрактные методы

Существует обходной путь для абстрактного метода ограничения; вы можете вызвать [doesNotRecognizeSelector:] для абстрактных методов реализации.

Ниже приведен пример иерархии классов, в которой базовый класс является абстрактным. Для более подробной информации вы можете взглянуть на этот thread (рассказывается о шаблоне шаблона в 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 

2. Защитив членов и методы

Существует уже хорошая thread на этом на Stackoverflow, вы можете проверить это.

+0

Спасибо за ваши комментарии, поэтому [self doesNotRecognizeSelector: _cmd] - это просто защита для разработчиков, случайно вызывающих метод на родительском классе? – Hazneliel

+0

Точно. Это не влияет на компилятор. Это просто справедливое предупреждение (во время выполнения), если разработчик забывает переопределить один из абстрактных методов в своей реализации подкласса. – Guven

Смежные вопросы