нужно множественное наследование в Objective C

Я хочу реализовать подвижный класс UIView (просмотр перемещается, когда вы касаетесь его и двигаете пальцем), например:

@interface MovableView : UIView {
  some members;
 }
-touchesBegan;
-touchesMoved;
@end

Как я могу применить этот код к UILabel, UIButton и т. д. без множественного наследования? В С++ я бы сделал это так (с UIView в качестве виртуальной базы для MovableView):

struct MovableLabel : UILabel, MovableView {};

Категории предлагаются в качестве альтернативы множественному наследованию, но я определенно не хочу расширять UIView с помощью категорий, потому что это будет применяться ко всем представлениям в моем приложении. Я только хочу, чтобы некоторые из моих взглядов были подвижными.

Моя текущая стратегия по предотвращению дублирования кода заключается в том, чтобы поместить код MovableView в заголовочный файл и включать его каждый раз, когда мне нужен какой-то класс для его использования. Кроме того, мне нужно добавить членов MovableView в любой класс, который я пишу. Это чистое уродство кода, но лучше, чем копирование/вставка кода по всему моему проекту.

Есть ли у кого-нибудь другие идеи, как обойти это ограничение Objective C [отсутствие множественного наследования]?

Спасибо,

Алтан


person Altan    schedule 20.07.2010    source источник
comment
возможный дубликат множественного наследования в Objective C   -  person mmmmmm    schedule 09.01.2012


Ответы (2)


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

Для вашей конкретной проблемы я мог бы подойти к этому, разработав MovableView как класс-контейнер, который был просто объектом, имеющим дочернее представление (UILabel, UIButton и т. д.), которое вы хотите переместить в качестве его подпредставления.

person Ben Zotto    schedule 20.07.2010
comment
И есть веская причина для запрета множественного наследования: в старые времена C++ такие методы вызывали ад зависимостей, а в наше время слабой связи вы хотите избежать чего-то вроде ада зависимостей. - person Ta Sas; 21.07.2010
comment
Отличная идея, Кихото. Немного больше работы в Interface Builder, но меньше классов и кода. - person Altan; 21.07.2010

Категории в любом случае не помогут, потому что замена реального метода touchesBegan на UIButton будет довольно плохой... вы не можете вызвать [super] из категории.

Другим решением было бы внедрить метод в эти определения классов с чем-то вроде:

Method origMethod = class_getClassMethod([UIButton class], @selector(touchesBegan));
Method newMethod = class_getClassMethod([TemplateClass class], @selector(replacementTouchesBegan));
method_exchangeImplementations(origMethod, newMethod);

Но это довольно неудобно. Хотя, если это действительно то место, куда вы хотите отправиться, стоит изучить...

Что бы я сделал, так это создал класс MovableView, который наследуется от UIView, и просто добавил бы все, что вы хотите перемещать, в качестве подвида этого представления (что, я думаю, может немного отличаться от того, что сказал Кихото, мои извинения, если нет). Он сначала отвечает на прикосновения и передает все, что ему не нужно, следующему ответчику... нет необходимости создавать специальный класс с одним подпредставлением. Затем в IB вы можете просто разместить эти подвижные представления где угодно и поместить в них что-то.

В общем, такие композиционные методы очень удобны для UIKit, а не для модификации основных классов.

person Kendall Helmstetter Gelner    schedule 20.07.2010