Angenommen, ich entwarf eine Komponente, die Griffe auf einem UI-Steuerelement für die Größenänderung darstellt.Ansätze für Objektunterklassen
jetzt offensichtlich ist jeder Griff nicht genau das gleiche in Bezug auf Verhalten, zum Beispiel des obere linke Griff ein North West Süd-Ost-Maus-Cursor angezeigt werden muß und Ziehen wird die Größe der Steuerung ändern während der obere mittlere Griff einen Nord-Süd-Mauszeiger zeigen muss und das Ziehen erlaubt es Ihnen nur, die Höhe zu ändern.
Im Hinblick auf die Umsetzung gibt es zwei grundlegende Ansätze: -
(1) ein Konstruktor, die Sie in Informationen übergeben müssen, wie zu dem, was kip Grip Sie entwerfen und dann eine riesige Switch-Anweisung haben innen das tatsächliche Verhalten des Griffes zu definieren, so wie: -
- initWithGripType(int)gripType
{
switch(gripType {
case TOP_MIDDLE_GRIP:
cursorType = northSouthCursor;
draggedMovement = upDown;
break;
case TOP_LEFT_GRIP:
cursorType = northWestSouthEastCursor;
draggedMovement = upDownLeftRight;
break;
...
...
...
}
}
(2) einen Griffbasisklasse, die die gemeinsamen Attribute definiert. Beispielsweise ist das Malen eines Griffs gleich, egal welcher Griff es ist. Und dann Klassen für jeden Typen Griff liks sub so: -
@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;
...
...
...
Ansatz zwei den Vorteil hat, dass ich keine Switch-Anweisungen zu erhalten und neue Grifftypen nach Belieben hinzufügen kann, ist der Nachteil, dass, wenn ich haben viele Grifftypen, jeder ist jetzt eine separate Quelle und Header-Datei.
Gibt es einen dritten Ansatz?