2012-02-03 7 views
1

スーパークラスは、NSXMLParserDelegateを実装するNSOperationクラスです。サーバーから返されたXMLデータとURL要求を送信するだけです。このクラスは、NSXMLParserDelegateも実装するサブクラスによって継承されています。親のパーサデリゲートは、XMLレスポンスの一般的なエラーをキャッチしてから、子パーサデリゲートに渡してより具体的な解析を行うことになっています。スーパークラス内Objective-Cのスーパークラス内で 'self'を呼び出す

@implementation Sub 

// main is not overidden in subclass 

// and this should return parser delegate in the sub class 
- (id) getParserDelegate { 
    return self; 
} 

@end 

私は希望スーパーのmainメソッド内で

Sub *theSub = [[Sub alloc] init]; 
[self.queue addOperation:theSub]; // Super's main method will be called 

すなわちサブ子のクラスを使用して操作をインスタンス化しています:サブクラス内

@implementation Super 

#pragma mark NSOperation method 
- (void) main { 
    id parentDelegate = [self getParserDelegate]; //? 
    id childDelegate = [self getParserDelegate]; //?? 
} 

// I would like this to return parser delegate in the super class 
- (id) getParserDelegate { 
    return self; 
} 

@end 

親と子の両方の代理人にアクセスするのが好きですが、私は「自己」がいつも決心しているサブとスーパーの間で 'self'が呼び出されているかどうかにかかわらず、SubからSubへと移動します。 Superのmain内からSuperのgetParserDelegateを呼び出すことは可能ですか、それとも単なる悪い設計ですか?

答えて

4

selfは、オブジェクトに直接ポインタです。したがって、継承チェーンに沿ってどこを調べても、同じことが解決されます。 selfのようなものはありません。スーパークラスに直接解決されるポインタはありません。これは、オブジェクト機能を拡張する学校であり、 'あります'の違いです。

self宛に送信されたメッセージは、常に最初の子の子クラスに送信され、通常の継承ルールに従って処理されます。結果として、デリゲートメソッドがスーパークラスにまっすぐに入る原因となるのは、NSXMLParserには絶対に何もありません。

ほとんどのロジックを実装する共通のアクターと、すっきりとした別のアクターを使って説明しているものは、それ自体デリゲートパターンです。だから、あなたが現在望んでいるものを自分のソブリンクラスに変えて、現在あなたが子供として持っているものをデリゲートとして添付することが、おそらく必要なのです。それが理にかなっている場合は、その委任関係にNSXMLParserDelegateプロトコルを再利用するだけです。

+0

「自己」についての私の混乱を解消しました。私は継承を破ることについてあなたが言っていることを得て、メインのパーサの代理人へのサブクラスとしてサブクラスを持っていると思います。それはうまくいくかもしれませんが、継承が必要なので、おそらくSuperからパーサーデリゲートを別のクラスに移動するような回避策を考えてみましょう。 – user1187378

0

スーパークラスは、その子どもが何をしているのか、また何をしているのか分かりません。

//in Super.h 
- (id) getParserDelegate; 

//in Super.m 
- (id) getParserDelegate { 
    return self; 
} 

//in Child.h 
- (id) getParserDelegate; 

//in Child.m 
- (id) getParserDelegate { 
    return [super getParserDelegate]; 
} 
関連する問題