как инициализировать объект подкласса "существующим объектом суперкласса" в target-C - PullRequest
1 голос
/ 02 февраля 2011

У меня есть подкласс класса 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 ]

0 голосов
/ 02 февраля 2011

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

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

Для достижения желаемого замените self=originalException на

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

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


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

0 голосов
/ 02 февраля 2011
self = originalException;

Когда вы это делаете, вы просто присваиваете объект NSException своему NSCustomException, так что произойдут следующие вещи:

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

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

Вам следует включить initWithName:reason:userinfo: и не выполнять назначение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...