Я знаю, что Objective-C не поддерживает абстрактные классы, но это, тем не менее, язык OO (http://en.wikipedia.org/wiki/Objective-C). Поэтому у меня есть несколько объектов с теми же методами, кроме одного, и я хотел бы следовать принципу DRY и не повторять много одного и того же кода в нескольких классах. Каков наилучший способ сделать это?реализация «шаблона метода шаблона» в объекте c
ответ
Так что у меня есть несколько объектов с теми же методами, кроме одного, поэтому я хотел бы следовать принципу DRY и не повторять много одного и того же кода в одном месте.
Я предполагаю, что вы имеете в виду «У меня есть несколько классов с тем же методами, за исключением одного».
Это зависит от того, насколько формально вы хотите быть в целом. Все начинается с базового класса, который имеет все общие методы. Я назову это @interface A : NSObject
.
Суб-классы A
унаследует от A
@interface A1 : A
@interface A2 : A
Суб-класс, который необходим уникальный метод, который я буду называть B
@interface B : A
Вы можете протестировать во время выполнения, чтобы узнать, способны ли объекты класса A выполнить этот уникальный метод.
A *a = ...
if ([a respondsToSelector:@selector(uniqueMethod)])
[(id)a uniqueMethod];
Это очень неформальный метод и может вызвать проблемы с техническим обслуживанием в будущем, если другие классы начнут внедрять уникальный метод.
Другой вариант - проверить принадлежность к классу.
A *a = ...
if ([a isKindOfClass:[B class]])
[(B *)a uniqueMethod];
Это все еще неформально, но обеспечивает лучшую защиту будущих изменений. Это также ограничивает будущую гибкость, потому что другим экземплярам A
может понадобиться использовать уникальный метод в будущем, но затем он должен быть реорганизован в подклассы B
.
Формальный способ для этого - протоколы. Я создам протоколы для A
и B
, которые я назову AP
и BP
. Это изменяет интерфейс для A
и B
.
@interface A : NSObject <AP>
@interface B : A <BP>
Теперь тест становится вопросом для соответствия.
A *a = ...
if ([a conformsToProtocol:@protocol(BP)])
[(id<BP>)a uniqueMethod];
Это позволяет обеспечить защиту и гибкость, но это больше усилий для поддержания, когда необходимы будущие изменения.
Надеюсь, что это поможет.
- 1. Правильная реализация шаблона адаптера в объекте c
- 2. Реализация функции шаблона шаблона C++
- 3. Scala - реализация шаблона «менеджер» в сопутствующем объекте?
- 4. Реализация шаблона фабрики в C++
- 5. Разочарование шаблона в объекте C
- 6. Реализация фабричного шаблона в C#
- 7. Реализация шаблона наблюдателя в C++
- 8. Создание шаблона метода - C++
- 9. Реализация атомарного шаблона C++ 0x
- 10. C++: реализация шаблона (стиль кода)
- 11. C++ только реализация класса шаблона
- 12. Неверная реализация функции шаблона C++
- 13. Резьбовая реализация шаблона наблюдателя - C++
- 14. Реализация шаблона кода с C#
- 15. Реализация метода удаления для шаблона репозитория
- 16. Реализация шаблона фабричного метода с использованием Spring
- 17. Создание шаблона метода шаблона класса
- 18. Реализация шаблона класса Matrix
- 19. Как установить значения в объекте шаблона C++?
- 20. Создание шаблона шаблона шаблона C++
- 21. Реализация шаблона декоратора
- 22. реализация стека в C++ с использованием шаблона
- 23. Некорректная реализация шаблона специализации
- 24. Реализация интерфейса класса шаблона
- 25. Вызов метода статического шаблона из функции шаблона
- 26. Реализация шаблона автомата в WPF
- 27. C++, аргумент шаблона шаблона
- 28. Реализация шаблона Win32 MVC
- 29. Реализация шаблона посетителя
- 30. Реализация шаблона хранилища
Обычный суперкласс кажется правильным решением. –
.... иначе известный как ** Абстрактный суперкластер **. См. Кластерные кластеры как один из наиболее широко используемых примеров такого шаблона. – bbum
Спасибо, это то, что я ожидал услышать. – pvllnspk