は、私は次のプロトコルがありますプロトコルで宣言され、匿名のカテゴリで実装されている参照名義は?
@protocol MyProtocol
@property (nonatomic, retain) NSObject *myProtocolProperty;
-(void) myProtocolMethod;
@end
を、私は次のクラスがあります:私はクラス拡張を宣言してい
@interface MyClass : NSObject {
}
@end
を、私はここに私のプロトコルのプロパティを再宣言するために持っているか、他の私がすることはできません私のクラスの残りの部分でそれらを実装します。
@interface()<MyProtocol>
@property (nonatomic, retain) NSObject *myExtensionProperty;
/*
* This redeclaration is required or my @synthesize myProtocolProperty fails
*/
@property (nonatomic, retain) NSObject *myProtocolProperty;
- (void) myExtensionMethod;
@end
@implementation MyClass
@synthesize myProtocolProperty = _myProtocolProperty;
@synthesize myExtensionProperty = _myExtensionProperty;
- (void) myProtocolMethod {
}
- (void) myExtensionMethod {
}
- (void) useMyConsumer {
[[[MyConsumer new] autorelease] consumeMyClassWithMyProtocol:self];
}
@end
MyConsumerが唯一のMyClassから呼び出されますので、彼らはパブリックAPIはありませんので、私はMyClassのはMyProtocolのメソッドを実装していることを確認するために、他のクラスを望んでいません。同様に、私はMyConsumerにMyClass内のクラス拡張を見たくはありません。
@interface MyConsumer : NSObject {
}
@end
@implementation MyConsumer
- (void) consumeMyClassWithMyProtocol: (MyClass<MyProtocol> *) myClassWithMyProtocol {
myClassWithMyProtocol.myProtocolProperty; // works, yay!
[myClassWithMyProtocol myProtocolMethod]; // works, yay!
myClassWithMyProtocol.myExtensionProperty; // compiler error, yay!
[myClassWithMyProtocol myExtensionMethod]; // compiler warning, yay!
}
@end
私は個人的にMyProtocolを実装するために、私のクラスの拡張内MyProtocolのプロパティを再宣言避けることができる方法はありますか?
正しい命名法を使用するように質問を編集しました。 –
私の使用シナリオをよりよく説明するためのコードもいくつか追加しました。 あなたの最初の段落で言ったことはすべて真です。しかし、それはまさに私が求めている行動です。 MyConsumerにMyProtocolが実装されていることを確認するだけです。 問題は、クラス拡張でMyProtocolからプロパティを再定義する必要があるか、またはそれらを@合成できないことです。私はその再定義を避けたい。 –
@Hath Borders更新された回答を参照してください。 –