プロトコルの一般的な実装でクラスをどのように装飾しますか?
当たり前の質問で申し訳ありません。私は客観的 c に慣れていないので、まだ少し水を踏んでいます。
一般的な実装が必要なプロトコルがあります。
@protocol SelectableElement <NSObject>
@property BOOL selected;
@end
選択可能にしたいオブジェクトがいくつかあります。
@interface Widget : NSObject <SelectableElement>
@end
@interface Duhicky : NSObject <SelectableElement>
@end
私がやりたいことは、プロトコルの実装を一度書き、両方のオブジェクトがそのように実装することを確認することです。
一般的なカテゴリを記述して両方にバインドできるとは思わないので、それを行う1つの方法は、共通クラスNSObjectにカテゴリを実装することだと思います:
@implementation NSObject (Selectable)
- (BOOL)selectable
{
if (![self conformsToProtocol:@protocol(SelectableElement)]) return;
return YES; // Use associative storage for this?
}
- (void)setSelectable:(BOOL)selectable
{
if (![self conformsToProtocol:@protocol(SelectableElement)]) return;
// set this associatively?
}
@end
もちろん、これを行うためにプロパティ変数を定義することはできません。連想オブジェクト ストアを使用する必要がありますが、ここでは説明しませんでした。
これは、選択可能な要素プロトコルを実装するものに一般的に選択可能な動作を追加する唯一の方法ですか? または、私が見逃しているより明白な方法はありますか?
もちろん、継承を使用してこの単純な例を実装できますが、それはこの方法で単一のプロトコルを実装する場合にのみ機能します。私が提案したこのアプローチは自然にフィットすると考えられますか、それともハックですか?
ジョー