Как работает разработанный инициализатор в Objective C? - PullRequest
0 голосов
/ 06 февраля 2011

Я читал этот вопрос и не понимаю, с какой проблемой он сталкивается. почему инициализация подклассов требует вызова той же самой функции инициализации суперкласса?

Из того, что я прочитал и понял.Каждый класс будет иметь свой собственный инициализатор.В этом случае, если у класса есть несколько инициализаторов.Допустим, у меня есть класс "Shape.h", подобный этому.

- (id) init
{
    return [self initWithHeight: 0];
}

- (id) initWithHeight: (int) h
{
    return [self initWithHeight:h withWidth:0];
}

- (id) initWithHeight: (int) h withWidth: (int) w
{
    if(self = [super init]); //since the superclass is NSObject, I use init as designated initializer
    {
        [self setHeight:h];
        [self setWidth:w];
    }
return self
}

И я подклассов нового класса с именем "Rectangle.h" из класса "Shape.h".Поскольку у меня есть «Shape.h», обозначенный как «- (id) initWithHeight: (int) h иWitdh: (int) w», это означает, что мне нужно будет использовать его для [super init] в «Rectangle.h»."класс верно?Это стало так.

- (id) initWithHeight: (int) h withWidth: (int) w
{
    return [self initWithHeight: h withWidth: w withColor:nil];
}

- (id) initWithHeight: (int) h withWidth: (int) w withColor: (NSString *) c
{
    if(self = [super initWithHeight:h andWidth:w])
    {
        [self setHeight:h];
        [self setWidth:w];
        [self setColor:c];
    }
return self;
}

В "Rectangle.h" я перезаписываю супер (который называется Shape.h), обозначенный init, и настраиваю его для соответствия классу, обозначенному "Rectangle.h".Является ли этот способ работы правильным и не вызывает зацикливание?Если это так, может кто-нибудь объяснить мне в опубликованной ссылке, почему он будет зацикливаться, если я использую [super init] без следования назначенному init суперклассу.

Извините, если я вызываю какую-либо путаницу.Я не могу хорошо понять концепцию.

1 Ответ

1 голос
/ 06 февраля 2011

Ваш код кажется правильным, вы пробовали это? Назначенный инициализатор является «наиболее полным» инициализатором, который должен использоваться всеми остальными инициализаторами. И это делают классы Rectangle и Shape. Итак, что вы делаете в инициализации Rectangle - инициализируете свой класс с помощью инициализатора super (Shape). Затем вы проверяете правильность self (может случиться так, что super вернул ноль по любой причине, например, ваши параметры w / h неверны; однако это не относится к Shape). Затем вы назначаете правильный цвет. Чего не следует делать, это переназначить высоту и ширину, поскольку это уже сделано инициализатором формы. Это имеет смысл делать только в том случае, если вашему новому классу необходимо переопределить настройки своего супер (независимо от причины). Итак, ваш код верен, но удалите два набора:



        [self setHeight:h];
        [self setWidth:w];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...