2009-06-09 6 views
0

Ich bin eine Basisklasse Knoten schaffen, die im wesentlichen Instanzen einer anderen Klasse umhüllt von einem Programm, das ich für ein Plugin schreibe, BaseAppObject. Eigenschaften von Knoten und jede Ableitung von Knoten speichern ihre Eigenschaften in dem BaseAppObject durch zwei Methoden BaseAppObject.SetUserString (Schlüssel, Wert) undBaseAppObject.GetUserString (Schlüssel, Wert).Wie implmentation von mehreren Konstrukteuren zwingen

Es gibt zwei Situationen, in denen ich einen Knoten instanziieren muss. Eine, wo die BaseAppObject ist sauber, und hat keine Benutzerzeichenfolgen. In diesem Fall müssen dem Konstruktor die Werte aller zu initiierenden Eigenschaften übergeben werden. Die zweite ist, wenn ich eine BaseAppObject, die bereits Benutzerzeichenfolgen definiert hat, und ich möchte einfach nur mit einem Node Objekt wickeln. In diesem Fall muss ich nur den Initialisierungskonstruktor ausführen, der das Feld _baseObject setzt. Alle anderen Eigenschaften des Objekts werden dann einfach aus den Benutzerzeichenfolgen gelesen, die in BaseAppObject festgelegt sind.

Hier ist eine vereinfachte Version von wie meine Klassen aussehen.

public abstract class Node 
{ 
    BaseAppObject _baseObject; 

    //reinitializing constructor 
    public Node(BaseAppObject baseObject) 
    { 
     this._baseObject = baseObject; 
    } 

    //initializing constructor 
    public Node(BaseAppObject baseObject, string name) 
    { 
     this._baseObject = baseObject; 
     this.Name = name; 
    } 

    public string Name 
    { 
     get { 
       string name = ""; 
       _baseObject.GetUserString("CPName", ref name); 
       return name;    
      } 

     set { 
       _baseObject.SetUserString("CPName", value); 
      } 
    } 
} 

Andere Klassen abgeleitet von Knoten zusätzliche Eigenschaften wie diese hinzufügen.

public CustomClass:Node 
{ 

    //reinitializing constructor 
    public CustomClass(BaseAppObject baseObj):base(baseObj) 
    { 
    } 


    //initializing constructor 
    public CustomClass(BaseAppObject baseObj,string name, string color):base(baseObj,name) 
    { 

     //here's an additional property added to CustomClass 
     public string Color 
     { 
      get { 
        string name = ""; 
        this.BaseObject.GetUserString("Color", ref name); 
        return name;    
       } 
      set { 
        this.BaseObject.SetUserString("Color", value); 
       } 
     } 
} 

Dies funktioniert, aber später, wenn ich (oder jemand anderes) will eine andere Klasse von Knoten sie müssen verstehen, abgeleitet werden, dass die abgeleitete Klasse zwei Konstruktoren haben muss. Eine für die Initialisierung und eine weitere für die Reinitialisierung.

Gibt es eine Möglichkeit, diese Implementierung für die Node-Klasse spezifisch zu machen? Oder ist eine gründliche Dokumentation die einzige Option?

Es gibt auch eine Möglichkeit zu vermeiden, den gleichen Konstruktor für einzelne Argumente (siehe unten) in jeder vom Knoten abgeleiteten Klasse zu platzieren.

//reinitializing constructor 
public ClassDerivedFromNode(BaseAppObject baseObject) 
{ 
    this._baseObject = baseObject; 
} 
+0

Ich glaube, Sie haben einen Tippfehler in diesem letzten Codefragment, es sollte die Syntax: base (_baseObject) verwenden. –

+0

Hu? Nein, ich übergebe das BaseAppObject vom CustomClass-Konstruktor zurück an den Basisknoten-Klassenkonstruktor. –

Antwort

0

Es gibt keine Möglichkeit, Unterklassen zum Erstellen von zwei Konstruktoren zu zwingen. Dokumentationen und Codeüberprüfungen sind nützlich, aber nicht idiotensicher. Andernfalls müssen Sie möglicherweise Überprüfungen im Konstruktor hinzufügen, um sicherzustellen, dass die Eigenschaft "CPName" festgelegt ist, wenn der Reinitialisierungskonstruktor aufgerufen wird, und eine Ausnahme ausgelöst wird, wenn dies nicht der Fall ist. Alternativ können Sie eine Debug.Assert statt eine Ausnahme auslösen.