2011-02-02 8 views
1

NSExceptionクラスをサブクラス化してCustomExceptionクラスを作成しました。Object-Cの "既存のスーパークラス"オブジェクトでサブクラスのオブジェクトを初期化する方法

@catchのコードで例外を検出するたびに、@Exceptionのパラメータとして渡されるNSExceptionのオブジェクトでCustomException(NSExceptionのサブクラス)のオブジェクトを初期化したいとします。私はCustomExceptionのinitメソッドにNSExceptionオブジェクトを渡すことでそれをやってみました。この

@catch (NSException * e) { 

CustomException * ex1=[[CustomException alloc]initWithException:e errorCode:@"-11011" severity:1]; 
} 

よう

何か。 は

//initializer for CustomException 
-(id) initWithException:(id)originalException errorCode: (NSString *)errorCode severity:(NSInteger)errorSeverity{ 

    //self = [super initWithName: name reason:@"" userInfo:nil]; 
    self=originalException; 
    self.code=errorCode; 
    self.severity=errorSeverity; 

    return self; 
} 

このdoen't作品を(下記のように私は渡されたNSExceptionオブジェクトに[スーパーのinit]置き換え)!どうすればこれを達成できますか?事前に

おかげ

答えて

0

OO言語ではサポートされていないものを実行しようとしています。クラスのインスタンスをそのサブクラスのインスタンスに変換します。これはNSExceptionの外にCustomExceptionをすることはありません -

あなたの割り当てself=originalExceptionはちょうど(タイプ間違った)ポインタ代入(コンパイラとランタイムは、あなたがタイプとしてid使用していたとしてないチェックします)です。あなたは

[super initWithName:[originalException name] 
     reason:[originalException reason] 
     userInfo:[originalException userInfo]] 

self=originalExceptionを交換した後、あなたがCustomExceptionに追加したフィールドを初期化していきたいものを達成するために

。 Objective-Cで


[*]それはは正しくサブクラスのインスタンスにクラスのインスタンスを変換するには、しかしは非常に非常に非常に非常に良い理由なしにそれををしないいくつかのケースで可能あります。そして、たとえそれを考えていてもいけないか分からなければ、

+0

ありがとう!できます!これを以前に認識したはずです – TheBlackPearl

+0

OOは、親コンクリート型を子型にダウンキャストすることをサポートしていません。しかし、この質問はコピーについて話しています。 C++では、次のようにこの質問に答えることができます:http://cpp.sh/3ar6m –

0
self = originalException; 

あなたがちょうどそう 次のことが起こるでしょう、あなたのNSCustomExceptionNSExceptionオブジェクトを割り当てていることを行うと:

  • あなたがやったときに警告を受けるかもしれません CustomExceptionからの割り当てがありますが、 はちょうどNSException オブジェクト;その後(

  • 、コンパイラはCustomExceptionクラス の一部 メソッドを呼び出すときに、それは 文句はありませんが、 それらに到達したとき、それがクラッシュしてしまいますので、selfCustomException対象だと思います。

initWithName:reason:userinfo:を有効にして、割り当てを行わないでください。

関連する問題