Цель C - подклассы классов с несколькими init-методами - PullRequest
0 голосов
/ 11 июля 2010

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

У меня есть класс, который реализует различные init-методы. F.E.

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

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

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

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

1 Ответ

1 голос
/ 11 июля 2010

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

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

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

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

+ circleInRect:...;

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

...