iは、明示的なサブクラス構造の場合に使用するものです:
@class MyObject;
@interface MONBase : NSObject
/* required override */
-(MyObject *)doSomething;
/* ... */
@end
@implementation MONBase
/* ... */
-(MyObject*)doSomething
{
assert(0 && "this override is required");
return nil;
}
@end
しかし ...プロトコルは、一般的に、多くの場合、これらと似たようなケースでは、より便利です。これを達成するための1つの方法が以下に示されています。それはプロトコルを実装し、共有ベースから継承 - OPでの使用に由来し、使用:
@class MyObject;
@protocol MONProtocol
/* required overrides: */
@required
- (MyObject *)doSomething;
/* optional overrides: */
@optional
@end
/* base, with shared implementation */
@interface MONBase : NSObject
@end
@implementation MONBase
- (MyObject *)doSomething
{
/*
as long as the sig matches, you won't need to declare it in the interface -- that may be a good thing.
you may prefer *not* to implement this, if you favor a runtime exception
*/
assert(0 && "this MONProtocol override is required");
return nil;
}
@end
/* subclass of MONBase which extends by implementing MONProtocol */
@interface MONSub : MONBase <MONProtocol>
{
MyObject* theIvar; /* << simplest case implementation */
}
@end
@implementation MONBase
/* ... */
- (MyObject *)doSomething
{
return [[theIvar retain] autorelease];
}
@end
プロトコルは、彼らが多重継承の多くの利点を提供するため、いいです、と非常に少ないの依存関係を提供しています。
そのメソッドで 'nil'を返すだけです... –