2012-04-03 9 views
2

Angenommen, ich entwarf eine Komponente, die Griffe auf einem UI-Steuerelement für die Größenänderung darstellt.Ansätze für Objektunterklassen

Control

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?

Antwort

0

Es gibt viele Möglichkeiten, dies als eine einzige Klasse zu implementieren, ohne eine unhandliche Switch-Anweisung verwenden zu müssen. Hier sind zwei:

  • Verwenden Bequemlichkeit Methoden (dh Factory-Methoden) an verschiedene gripTypes
  • Verwenden Sie ein NSDictionary anstelle einer switch-Anweisung den Griff zu bekommen Eigenschaften einzurichten basierend auf ihrem Typ

Ich würde mich darauf konzentrieren, es in einer Methode zu halten, denn wenn Sie das Verhalten von durch Unterklassen anpassen möchten, müssten Sie bei Ihrem zweiten Ansatz eine andere Unterklasse für jeden Typ schreiben oder Ihre Klassenhierarchie überarbeiten.

Verwandte Themen