Как инициализировать объект подкласса "существующим объектом суперкласса" в 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:
и не делай назначения.