如何在objective-C中使用“超类的现有对象”初始化子类的对象

时间:2011-02-02 08:21:37

标签: objective-c inheritance subclass init superclass

我已经创建了NSException类的子类来创建CustomException类。

每当我在代码中捕获异常(在@catch中)时,我想用NSException的对象初始化一个CustomException对象(NSException的子类),该对象作为参数传递给@catch。

像这样的东西

@catch (NSException * e) {

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

我试过将NSException对象传递给CustomException的init方法。 (我将[super init]替换为传递的NSException对象,如下所示)

//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;
}

这不起作用!我怎样才能做到这一点?

提前致谢

2 个答案:

答案 0 :(得分:0)

self = originalException;

当你这样做时,你只需要为NSException分配一个NSCustomException对象 以下事情将会发生:

  • 执行此操作时可能会收到警告 从那以后的任务 预计会CustomException,但是你 正在通过NSException 对象;(

  • 之后,编译器会认为self 是一个CustomException对象所以它 在打电话时不会抱怨 CustomException类的方法 但到达时会崩溃 那些。

您应该启用initWithName:reason:userinfo:并且不要执行任务。

答案 1 :(得分:0)

您正在尝试执行某些通常[*]在任何OO语言中都不受支持的操作 - 将类的实例转换为其子类之一的实例。

您的作业self=originalException只是(类型不正确)指针赋值(编译器和运行时将检查,因为您使用id作为类型) - 这不会CustomException中的NSException

要实现您想要的内容,请使用

替换self=originalException
[super initWithName:[originalException name]
       reason:[originalException reason]
       userInfo:[originalException userInfo]]

然后继续初始化您在CustomException中添加的字段。


[*]在Objective-C中, 在某些情况下可以正确地将类实例转换为子类实例,但是不要这样做非常好的理由。如果你不知道你怎么也不应该想到它; - )