Зачем переопределять назначенный инициализатор суперкласса? - PullRequest
2 голосов
/ 22 апреля 2011

Я читал книгу " Шаблон проектирования какао ", и 2 ее пункта, в главе 3 (Создание двухэтапной схемы), приводят меня в замешательство.

  1. Убедитесь, что назначенный инициализатор суперкласса переопределен для вызова нового назначенного инициализатора.

  2. При создании подклассов убедитесь, что каждый новый инициализатор, который не является назначенным инициализатором, вызывает назначенный инициализатор.

Мой вопрос: как мы можем вызвать метод, для которого у нас нет параметров для передачи? Пример книги публикуется ниже. В этом методе писатель передал некоторые «статические» значения, но мы должны это делать? Или это всегда желательно?

Мой второй вопрос: почему я должен переопределить назначенный метод суперкласса, когда я никогда не буду вызывать его, когда буду инициализировать свой объект, кроме как в моем собственном назначенном инициализаторе, где я не буду передавать какие-либо параметры ( например, в случае NSObject)

@interface MYCircle : NSObject {

NSPoint center;

float   radius; 

}

// Designated Initializer 

- (id)initWithCenter:(NSPoint)aPoint radius:(float)aRadius;

@end 

@implementation MYCircle

// Designated Initializer 

- (id)initWithCenter:(NSPoint)aPoint radius:(float)aRadius {

self = [super init];

if(nil != self) {

center = aPoint;

radius = aRadius; 

}

return self; 

}

@end



// Overriden inherited Designated Initializer 
- (id)init {

static const float MYDefaultRadius = 1.0f;

// call Designated Initializer with default arguments

return [self initWithCenter:NSZeroPoint radius:MYDefaultRadius]; 

}

Пожалуйста, также помогите мне исправить мой вопрос, потому что я не уверен, что то, что я действительно спрашиваю, является правильным вопросом.

Спасибо.

1 Ответ

6 голосов
/ 22 апреля 2011

Назначенный инициализатор - это тот, который правильно настраивает объект. Если вы не выбрали один метод init ... в качестве назначенного инициализатора, то вы должны убедиться, что каждый метод init ... делает правильные вещи. Как правило, это означает, что все они должны иметь один и тот же код или все они должны вызывать общий метод установки. Это также означает, что любой подкласс класса должен переопределять все методы init ... вместо одного.

Выбирая (т. Е. "Назначая") один метод init ... в качестве общего метода, который вызывают все остальные, вы даете подклассам одну точку переопределения и единственный метод, который могут вызываться их собственными методами init ... для обеспечения что суперкласс правильно настроен.

Если у вас нет данных, необходимых для вызова назначенного инициализатора, то у вас нет данных, необходимых для настройки суперкласса. Иногда вы можете выбрать разумные значения по умолчанию, как указано выше, но если нет, то нет смысла создавать объект под рукой.

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