Я думал об использовании шаблона декоратора для расширения функциональности UIKit класс. Проблема, с которой я столкнулся, состоит в том, что из примеров, которые я видел на других языках, шаблон заставляет меня дублировать интерфейс декорированного объекта. Вот как я бы увидел реализацию шаблона:
// Inheritance used for compile time check only
@interface UIScrollViewDecorator : UIScrollView
{
UIScrollview *decoratedScrollView;
}
- (id)initWithScrollView:(UISCrollView*)scrollView;
@end
@implementation UIScrollViewDecorator
- (id)initWithScrollView:(UISCrollView*)scrollView
{
self = [super init];
if(self != nil)
{
decoratedScrollView = [scrollView retain];
// maybe set up some custom controls on decoratedScrollView
}
}
// all methods for UIScrollView need to be manually passed to the decorated object
// -- this is the problem
- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated
{
// use "overwritten methods" to mess with the input for the decorated scroll view
// most of the time though I have no need to make any adjustments here; I still need
// to pass all these messages through so that outside users can interact with me just
// like with a real UIScrollView
[decoratedScrollView scrollRectToVisible:rect animated:animated];
}
@end
Итак, чтобы подвести итог, проблема заключается в дублировании метода декорированного объекта, даже когда мне не нужно там ничего менять. Есть ли более простой способ передать те методы, которые мне не нужно «перезаписывать»? Могу ли я использовать для этого что-то вроде NSProxy?
РЕДАКТИРОВАТЬ: Это стало для меня в основном теоретической проблемой, так как я понял, что шаблон декоратора - не то, что мне нужно для решения моей реальной проблемы. Однако, поскольку в будущем я, возможно, снова им воспользуюсь, мне все еще очень интересны ваши ответы.