Как инициализировать объект подкласса "существующим объектом суперкласса" в target-C

Я создал подкласс класса NSException для создания класса CustomException.

Всякий раз, когда я ловлю исключение в коде (в @catch), я хочу инициализировать объект CustomException (подкласс NSException) с объектом NSException, который передается в качестве параметра @catch.

Что-то вроде этого

@catch (NSException * e) {

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

Я попытался сделать это, передав объект NSException в метод init CustomException. (я заменил [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 ответа

Решение

Вы пытаетесь сделать что-то, что обычно [*] не поддерживается ни в одном языке OO - конвертировать экземпляр класса в экземпляр одного из его подклассов.

Ваше назначение self=originalException это просто (введите неверное) указатель назначения (который компилятор и среда выполнения не будут проверять, как вы использовали id как тип) - это не сделает CustomException из NSException,

Чтобы добиться того, что вы хотите заменить self=originalException с

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

а затем продолжить инициализацию полей, которые вы добавили в CustomException,


[*] В Objective-C в некоторых случаях возможно правильно преобразовать экземпляр класса в экземпляр подкласса, но не делайте этого без очень очень очень очень веской причины. И если вы не знаете, как вы не должны думать об этом;-)

self = originalException;

Когда вы делаете это, вы просто назначаете NSException возражать против вашего NSCustomException поэтому произойдут следующие вещи:

  • Вы можете получить предупреждение при выполнении задания сCustomException ожидается, но вы проходите только NSExceptionобъект;(

  • После этого компилятор будет думать, что selfэто CustomException объект, поэтому он не будет жаловаться при вызове некоторых методов CustomException класс, но он потерпит крах при достижении тех.

Вы должны включить initWithName:reason:userinfo: и не делай назначения.

Другие вопросы по тегам