как подкласс это? DarwiinRemote Цель C - PullRequest
0 голосов
/ 09 апреля 2011

Я использую этот класс:


@interface NSObject( WiiRemoteDiscoveryDelegate )

- (void) WiiRemoteDiscovered:(WiiRemote*)wiimote;
- (void) WiiRemoteDiscoveryError:(int)code;

@end;

но как мне сделать это подклассом?

1 Ответ

0 голосов
/ 09 апреля 2011

Это называется неформальным протоколом, и именно так фреймворки Cocoa в основном объявляли методы делегата до последних версий Mac OS X.

Этот блок кода просто говорит о том, что он вызовет методы "WiiRemoteDiscovered:" и "WiiRemoteDiscoveryError:" для некоторого объекта. Название категории «WiiRemoteDiscoveryDelegate» указывает на то, что он планирует вызывать эти методы для делегата.

Представьте себе такой код:

@interface WiiRemoteDiscoverer {
    id delegate;
}
@property id delegate;
- (void)startDiscovery;
@end

@implementation WiiRemoteDiscoverer
@synthesize delegate;
- (void)startDiscovery {
    /* do the discovery ... */
    [delegate WiiRemoteDiscoveryError:-1];
}
@end

Если бы вы это построили, вы бы получили предупреждение компилятора в строке, которая вызывает WiiRemoteDiscoveryError: потому что этот метод нигде не был объявлен. Чтобы избежать этого, вы можете сделать одну из двух вещей. Вы можете сделать то, что сделали авторы этого класса, и добавить это в шапку:

@interface NSObject( WiiRemoteDiscoveryDelegate )
- (void) WiiRemoteDiscovered:(WiiRemote*)wiimote;
- (void) WiiRemoteDiscoveryError:(int)code;
@end;

Этот блок в основном говорит, что каждый объект реализует WiiRemoteDiscovered: (что не соответствует действительности) и отключает предупреждение компилятора.

Или вы могли бы сделать что-то более формальное, как это:

@protocol WiiRemoteDiscovererDelegate <NSObject>
- (id)wiiRemoteDiscoveryError:(int)errorCode;
@end

@interface WiiRemoteDiscoverer {
    id <WiiRemoteDiscovererDelegate> delegate;
}
@property id <WiiRemoteDiscovererDelegate> delegate;
- (void)startDiscovery;
@end

@implementation WiiRemoteDiscoverer
@synthesize delegate;
- (void)startDiscovery {
    /* do the discovery ... */
    [delegate wiiRemoteDiscoveryError:-1];
}
@end
...