нужно множественное наследование в Objective C - PullRequest
3 голосов
/ 21 июля 2010

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

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

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

struct MovableLabel : UILabel, MovableView {};

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

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

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

Спасибо,

Алтан

Ответы [ 2 ]

7 голосов
/ 21 июля 2010

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

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

2 голосов
/ 21 июля 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, а не модифицируют базовые классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...