Когда у класса будет более одного назначенного инициализатора? - PullRequest
8 голосов
/ 21 сентября 2011

Прочитав документацию Apple по Советы и методики для разработчиков платформ , я натолкнулся на следующее утверждение о назначенных инициализаторах:

Назначенный инициализатор - это метод init класса, которыйвызывает метод init суперкласса.(Другие инициализаторы вызывают методы init, определенные классом.) Каждый открытый класс должен иметь один или несколько обозначенных инициализаторов.

(выделение добавлено).

Исходя из моего понимания - и действительно, самого употребления слова «обозначенный» - у класса должен быть только один назначенный инициализатор.Но согласно документации, допустимы несколько назначенных инициализаторов.

Предполагая, что у вас есть два (или более) назначенных инициализатора, их роль состоит в том, чтобы вызвать назначенный инициализатор суперкласса, чтобы гарантировать правильную инициализацию объекта.Но если оба назначенных инициализатора вызывают инициализатор, назначенный одному и тому же суперклассу, тогда зачем было нужно больше одного?Разве класс не должен подвергаться рефакторингу для направления всех других init методов к единственному назначенному инициализатору?

Я просто немного сбит с толку относительно того, какой вариант использования или шаблон проектирования будет вызывать несколько назначенных инициализаторов?

1 Ответ

6 голосов
/ 21 сентября 2011

Это можно сделать, если вы хотите иметь разную инициализацию для разных объектов одного и того же класса.Одним из примеров являются кластеры классов, такие как NSNumber.У него довольно много инициализаторов для разных типов чисел, которые они могут хранить.Чтобы обеспечить наиболее точное представление, класс должен хранить свое значение в том же формате, в котором он его получил, вместо приведения.Это означает, что инициализаторы не могут просто вызвать общий инициализатор и вернуться.Им нужно сделать какую-то нестандартную работу.Это делает их назначенным инициализатором.

Другим примером может быть класс документов, который должен выполнять некоторую инициализацию только для новых файлов и некоторую другую инициализацию только для открываемых документов.Оба эти инициализатора будут вызывать свою супер реализацию, которая, в свою очередь, вызывает простой метод init для общей инициализации.Однако, поскольку они не просто вызывают другой инициализатор со значением по умолчанию, они считаются назначенными инициализаторами.

...