2009-06-09 6 views
0

je crée une classe de base Noeud qui enveloppe essentiellement des cas d'une autre classe d'un programme que je suis en train d'écrire un plugin pour, BaseAppObject. Propriétés de Noeud et toute dérivation de nœud stockent leurs propriétés dans le BaseAppObject par deux méthodes BaseAppObject.SetUserString (clé, valeur) et BaseAppObject.GetUserString (clé, valeur).Comment forcer implmentation de plusieurs constructeurs

Il existe deux situations dans lesquelles j'ai besoin d'instancier un noeud. Un où BaseAppObject est propre et n'a pas de chaînes utilisateur. Dans ce cas, le constructeur doit recevoir les valeurs de toutes les propriétés à initialiser. La seconde est quand j'ai un BaseAppObject qui a déjà des chaînes d'utilisateurs définies et je veux simplement l'emballer avec un objet Node. Dans ce cas, j'ai seulement besoin d'exécuter le constructeur d'initialisation qui définit le champ _baseObject. Toutes les autres propriétés de l'objet seront ensuite simplement lues à partir des chaînes utilisateur définies dans BaseAppObject .

Voici une version simplifiée de ce à quoi ressemblent mes classes.

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); 
      } 
    } 
} 

Autres classes dérivées de peuvent ajouter noeud propriétés supplémentaires comme celui-ci.

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); 
       } 
     } 
} 

Cela fonctionne, mais plus tard si je (ou quelqu'un d'autre) veut faire une autre classe dérivée de nœud, ils doivent comprendre que la classe dérivée doit avoir deux constructeurs. Un pour l'initialisation et un autre pour la réinitialisation.

Existe-t-il un moyen de rendre cette implémentation intrinsèque à la classe Node? Ou est-ce que la documentation complète est la seule option?

Il existe également un moyen d'éviter de placer le même constructeur d'argument unique (ci-dessous) dans chaque classe dérivée du nœud.

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

Je pense que vous avez une faute de frappe dans ce dernier fragment de code, il devrait utiliser la syntaxe: base (_baseObject). –

+0

Hu? Non, je passe le BaseAppObject du constructeur CustomClass au constructeur de la classe Node de base. –

Répondre

0

Il est impossible de forcer des sous-classes à créer deux constructeurs. La documentation et les revues de code sont utiles, mais pas infaillibles. Sinon, vous devrez peut-être ajouter des vérifications dans le constructeur pour vous assurer que la propriété "CPName" est définie si le constructeur reinitialize est appelé et que vous lancez une exception si ce n'est pas le cas. Alternativement, vous pouvez faire un Debug.Assert au lieu de lancer une exception.

1

Vous voudrez peut-être considérer Factory Methods comme une solution à votre problème.

Questions connexes