2010-12-09 47 views
3

Est-il possible de créer une instance d'un objet enfant en utilisant le constructeur du parent et de lui passer une sorte de paramètre (une chaîne, dans ce cas) pour lui indiquer le type d'enfant à créer ?Créer un objet enfant dans le constructeur parent

+0

Vous avez déjà essayé? – tenfour

+1

Le type de l'objet enfant est-il hérité du type du parent? Si oui, vous cherchez une méthode d'usine. –

+0

+1 Oliver: ça me semble définitivement aussi une usine. – LaGrandMere

Répondre

8

Non. En C#, vous créez une instance d'une classe, puis l'environnement d'exécution appelle son constructeur. Au moment où le constructeur s'exécute il est trop tard pour choisir un autre type. Cependant, un constructeur de classe dérivée appelle toujours l'un de ses constructeurs de classe de base, et vous pouvez l'utiliser à votre avantage (pour éviter de répéter le code).

Les gens créent souvent factories pour faire ce dont vous parlez. Par exemple, étant donné les classes Parent, Child1:Parent et Child2:Parent, vous pourriez écrire une usine comme ceci:

public class ParentFactory { 
    public Parent CreateParent(string type) { 
     switch(type) { 
      case "Child1": 
       return new Child1(); 
      case "Child2": 
       return new Child2(); 
      default: 
       throw new ArgumentException("Unexpected type"); 
     } 
    } 
} 
0

Je ne sais pas si je comprends bien, mais voici ce que je compris :)

public class parent:child 
{ 
    private child childObj; 
    public parent(string childName) 
    { 
     childObj = new child(childName); 
    } 

} 
public class child 
{ 
    private string name; 

    public child(string _name) 
    { 
     name = _name; 
    } 
} 
+0

Pas tout à fait cela. Il fait la même chose que la réponse fournie par GenericTypeTea, ce qui n'est pas ce que je voulais. – Farinha

1

Si je vous ai bien compris, vous voulez créer une classe A et une classe B qui dérive de A. Ensuite, vous voulez appeler new A("B") et cela devrait vous renvoyer un nouvel objet B?

Ce n'est pas possible.

Cependant, je ne sais pas ce que vous essayez d'accomplir, mais peut-être que vous devriez vérifier réflexion, car il vous permet de créer une instance d'une classe par sa chaîne de nom.

http://msdn.microsoft.com/en-us/library/dex1ss7c.aspx

var obj = myAssembly.CreateInstance("myNamespace.myClassB");