Зачем использовать [super init] в конструкторах Objective C? - PullRequest
1 голос
/ 14 февраля 2012

Скажем, у меня есть класс с именем Item. Который является суперклассом NewsItem и TwitterItem.

Если я хочу создать какой-то NewsItem, я должен использовать (внутри конструктора)

    self = [super init];

Если да, то почему? В Java / C # я бы просто сделал,

    NewsItem n = new NewsItem();

Мне не нужно ничего делать с суперклассами в Java / C #. Просто не могу этого понять.

Ответы [ 4 ]

6 голосов
/ 14 февраля 2012

В Java и C # компилятор автоматически заставляет ваш конструктор вызывать конструктор суперкласса, если вы не вызываете его явно.Например, «Учебники Java» говорят следующее: :

Если конструктор не вызывает явно конструктор суперкласса, компилятор Java автоматически вставляет вызов в конструктор без аргументовсуперкласса.Если у суперкласса нет конструктора без аргументов, вы получите ошибку во время компиляции.У Object действительно есть такой конструктор, поэтому, если Object является единственным суперклассом, проблем нет.

В Objective-C компилятор не делает это автоматически, поэтому вы должны сделать это самостоятельно.

5 голосов
/ 14 февраля 2012

Поскольку вашему суперклассу (и суперклассу вашего суперкласса) тоже нужен шанс для инициализации.

И имейте в виду, что ваш суперкласс будет [редко] возвращать ноль или другой экземпляр.

Вот почему вы делаете:

- (id)init
{
    self = [super init];
    if (self) {
        ... init stuff ....
    }
    return self;
}
1 голос
/ 14 февраля 2012

Потому что вы переопределяете сообщение инициализации. Если вы не переопределите его, [[NewsItem alloc] init] просто вызовет сообщение инициализации суперкласса. В C # вы можете использовать base , чтобы сделать то же самое.

0 голосов
/ 14 февраля 2012

, поскольку ваш пользовательский объект будет по крайней мере наследоваться от матерей всех Объектов: NSObject, вы должны вызвать '[super init];' 'super' просто вызывает метод init своего суперкласса

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