1

重複の可能性:
NSDictionary から継承するには?

API によると、メソッドをオーバーライドする必要があります。

setObject:forKey:
removeObjectForKey:
initWithObjects:forKeys:
count
objectForKey:
keyEnumerator

それらをオーバーライドする方法の例を教えてください。

4

1 に答える 1

5

これは実際には、単に NSMutableDictionary をサブクラス化するよりも複雑です。NSMutableDictionary (および同様に NSMutableArray) は不透明なクラスです。つまり、それらは、通常の具象クラスのように適合しない動的データ構造を隠す単なるインターフェースであるということです。具体的には、NSMutableDictionary を作成すると、NSMutableDictionary インターフェイスを利用するクラスを取得しますが、実際には NSMutableDictionary ではありません! つまり、返されたクラスは実際にはあなたのクラスではありません。NSMutableDictionary をサブクラス化することは、実際にはカスタム機能を備えた NSMutableDictionary インターフェースを実装することです。

必要なことは、サブクラスにメンバー変数としてデータ構造を持たせ (最も単純なのは NSMutableDictionary だけです)、オーバーライド メソッドを実装するときにそのクラスを使用することです。

例:

@interface MyMutableDictionary : NSMutableDictionary

... interface methods ...

@end

@implementation MyMutableDictionary
{
    NSMutableDictionary* _proxy;
}

- (id) init {
    if (self = [super init]) {
        _proxy = [[NSMutableDictionary alloc] init];
    }
    return self;
}

... implementation of methods ...

- (void) setObject:(id)obj forKey:(id)key {
    if (obj) {
        [_proxy setObject:obj forKey:key];
    } else {
        [_proxy removeObjectForKey:key];
    }
}

@end

この例は、nil オブジェクトを設定するときに例外をスローせず、代わりにそのキーを持つオブジェクトを削除するカスタム NSMutableDictionary を実装する方法を示す人為的なものです。残りのメソッドについては、 forwardingTargetForSelector: メソッドを直接使用して、_proxy メンバーに未実装のメソッドを引き継がせる必要があります (ただし、代わりに NSObject をサブクラス化し、変更可能な辞書に必要なすべてのメソッドを明示的に宣言する必要があります)。 - そうしないと、動作しない実際の NSMutableDictionary メソッドが使用されるためです)。

- (id) forwardingTargetForSelector:(SEL)aSelector
{
    return _proxy;
}
于 2012-10-17T04:02:06.203 に答える