Objective C - классы подклассов с несколькими методами инициализации

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

У меня есть классная ведьма, реализующая различные методы инициализации. например

@interface Circle {
    CGPoint   center;
    float   radius;
}
- (id)initWithCenter:...radius:...;
- (id)initWithRect:...;  
- (id)initWithPoly:...;

Теперь ф.э. Я хочу создать класс перекрестия в качестве подкласса. Поэтому я хочу добавить, возможно, несколько строк в качестве переменных экземпляра. Итак, проблема в том, что каждый объект-перекрестие должен быть инициализирован некоторыми конкретными значениями, но, конечно, методы инициализации круга не изменятся. поэтому я хочу каждый метод инициализации из суперкласса, но добавляю эти конкретные аргументы к каждому.

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

большое спасибо


person Tobi    schedule 11.07.2010    source источник


Ответы (1)


Как правило, у вас есть один вариант метода init*, который является назначенным инициализатором. Все остальные методы init* вызывают его, а затем выполняют необходимую настройку. Подклассы обычно либо добавляли новые варианты init*, вызывающие [self init*] для назначенного инициализатора в первую очередь, или подклассы переопределяли назначенный инициализатор (и другие по мере необходимости).

Однако это может быстро выйти из-под контроля. Для вашего Круга действительно кажется, что вы просто хотите:

- (id)initWithCenter:...radius:...;

А затем создаст серию удобных фабричных методов для обработки других типов:

+ circleInRect:...;

(Я подозреваю, что ваш код является надуманным примером, иначе я бы также указал на странность, заключающуюся в том, что класс «перекрестие» является подклассом класса «круг». Для чего-то подобного я, вероятно, начал бы с класса Shape , а затем добавьте Circle и Crosshair в качестве подкласса Shape. Очевидно, что пример Sketch очень актуален.)

person bbum    schedule 11.07.2010