2012-04-03 6 views
2

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

Control

Теперь, очевидно, каждая ручка не точно такой же, с точки зрения поведения, например, в левом верхнем углу захвата будет отображать курсор Северо-Запад Юго-Восток мыши и перетащить будет изменить размер элемента управления тогда как верхняя средняя рукоятка должна показывать северный курсор мыши и перетаскивание, это позволит вам изменить высоту.

С точки зрения реализации существует два основных подхода: -

(1) конструктор, который требует, чтобы передать информацию относительно того, что Кип сцепления вы разрабатываете, а затем иметь огромное заявление переключатель внутри определить реальное поведение тисков так: -

- initWithGripType(int)gripType 
{ 
    switch(gripType { 
     case TOP_MIDDLE_GRIP: 
      cursorType = northSouthCursor; 
      draggedMovement = upDown; 
      break; 
     case TOP_LEFT_GRIP: 
      cursorType = northWestSouthEastCursor; 
      draggedMovement = upDownLeftRight; 
      break; 
     ... 
     ... 
     ... 
    } 
} 

(2) имеет базовый класс сцепления, который определяет общие атрибуты. например, покраска захвата - это то же самое, какой бы ни была захват. А затем суб-классов для каждого типа Liks хватка так: -

@interface Grip : NSObject { 
    NSCursor _cursorType; 
    int _draggedMovement; 
} 

// force init to be unavilable for base class 
- (id)init __attribute__((unavailable("Instantiate subclass instead."))); 
- (void)drawGrip; 

@end; 



@interface GripTopLeft : Grip { 
} 

- (id)init; 

@end; 

@interface GripBottomLeft : Grip { 
} 

- (id)init; 

@end; 

... 
... 
... 

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

Есть ли третий подход?

ответ

0

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

  • Используйте удобные методы (например, фабричные методы), чтобы получить различные gripTypes
  • использовать NSDictionary вместо переключателя заявление, чтобы настроить свойства хваткой, основанный на его типа

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

Смежные вопросы