Предположим, что я проектировал компонент, представляющий захваты в элементе управления пользовательского интерфейса, для его изменения.Подходы к подклассу объектов
Теперь, очевидно, каждая ручка не точно такой же, с точки зрения поведения, например, в левом верхнем углу захвата будет отображать курсор Северо-Запад Юго-Восток мыши и перетащить будет изменить размер элемента управления тогда как верхняя средняя рукоятка должна показывать северный курсор мыши и перетаскивание, это позволит вам изменить высоту.
С точки зрения реализации существует два основных подхода: -
(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;
...
...
...
подход два имеет то преимущество, что у меня нет, чтобы поддерживать какое-либо заявление коммутатора и может добавлять новые типы сцепных по желанию, недостаток является то, что если я имеют много типов захвата, каждый из которых теперь является отдельным исходным и заголовочным файлом.
Есть ли третий подход?