прямой протокол @ требуется для подклассов - PullRequest
6 голосов
/ 31 мая 2011

У меня есть:

@interface SuperClass : UIViewController <UITableViewDelegate,UITableViewDataSource>

А потом

@interface SubClass : SuperClass

В этом SuperClass не реализованы необходимые методы протокола SubClass один делает.
Возможно ли эточтобы предотвратить предупреждения (говоря, что реализация суперкласса является неполной)?

Вместо реализации пустых / нулевых методов в SuperClass, можно ли выполнить проверку @required предупреждений по SubClass?

Ответы [ 4 ]

10 голосов
/ 31 мая 2011

Вы можете не объявлять принятие протокола в суперклассе, но требовать соответствия во всех подклассах. Это может быть сделано путем реализации +initialize в вашем суперклассе следующим образом:

+ (void)initialize
{
  if (self != [SuperClass class] && 
      ![self conformsToProtocol:@protocol(UITableViewDelegate)])
  {
    @throw [NSException ...]
  }
}

Таким образом, всякий раз, когда подкласс SuperClass инициализируется, он генерирует исключение, если он не соответствует <UITableViewDelegate>. Это не требует дальнейшей работы после помещения этого в суперкласс.

5 голосов
/ 31 мая 2011

Нет, то, что вы просите, это, по сути, абстрактные классы, которых нет в Objective-C.

Лучше всего заглушить методы в базовом классе, чтобы создать какое-то исключение.

0 голосов
/ 18 сентября 2017

Да, это возможно при использовании расширения частного класса.

Пример 1

Superclass.h

@interface Superclass : UIViewController
@end

Superclass.m

@interface Superclass()<UITableViewDelegate, UITableViewDataSource>
@end

@implementation Superclass
// implement interface methods
@end

Subclass.h

@interface Subclass : Superclass<UITableViewDelegate, UITableViewDataSource>
@end

Пройдя еще дальше, вы можете переместить расширение частного класса в закрытый заголовок Superclass + Private.h, тогда ваши другие внутренние классы могут знать, что оно также реализует их.

Пример 2

Superclass + Private.h

#import "Superclass.h"

@interface Superclass()<UITableViewDelegate, UITableViewDataSource>
@end

Superclass.m

#import "Superclass+Private.h>

@implementation Superclass
// implement interface methods
@end

Примечание Существует ограничение, заключающееся в том, что этот метод не позволяет переопределять и вызывать метод super in, который подкласс не реализовал в своем суперклассе. Для этих методов я бы рекомендовал шаблон подкласса UIGestureRecogniser.

0 голосов
/ 31 мая 2011

Если SuperClass не соответствует протоколам UITableViewDelegate и т. Д., Его не должно быть в .h.

Вы можете просто переместить протоколы на SubClass.

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