2010-12-09 10 views
3

Ist es möglich, eine Instanz eines untergeordneten Objekts mithilfe des Konstruktors des übergeordneten Elements zu erstellen und eine Art von Parameter (in diesem Fall eine Zeichenfolge) zu übergeben, um den Typ des untergeordneten Objekts anzugeben ?Unterobjekt in übergeordnetem Konstruktor erstellen

+0

hast du es versuchen? – tenfour

+1

Wird der Typ des untergeordneten Objekts vom Typ des übergeordneten Objekts übernommen? Wenn ja, suchen Sie nach einer Fabrikmethode. –

+0

+1 Oliver: klingt für mich wie eine Fabrik. – LaGrandMere

Antwort

8

Nein. In C# erstellen Sie eine Instanz einer Klasse, , dann Die Laufzeit ruft ihren Konstruktor auf. Wenn der Konstruktor ausgeführt wird, ist es zu spät, um einen anderen Typ auszuwählen.

Allerdings ruft ein Konstruktor einer abgeleiteten Klasse immer einen Konstruktor der Basisklasse auf, und Sie können dies zu Ihrem Vorteil verwenden (um zu vermeiden, dass Code wiederholt wird).

Menschen oft erstellen factories zu tun, wovon Sie sprechen. Zum Beispiel, da die Klassen Parent, Child1:Parent und Child2:Parent, könnte man eine Fabrik wie folgt schreiben:

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

nicht sicher, ob ich richtig verstanden, aber hier ist das, was ich :)

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

Nicht ganz so. Es tut dasselbe wie die Antwort von GenericTypeTea, die nicht das ist, was ich wollte. – Farinha

1
verstanden

Wenn ich Sie richtig verstehe, möchten Sie eine Klasse A und eine Klasse B erstellen, die von A abgeleitet ist. Dann möchten Sie new A("B") anrufen und dies sollte Ihnen ein neues B-Objekt zurückgeben?

Das ist nicht möglich.

aber ich weiß nicht, was Sie versuchen zu erreichen, aber vielleicht sollten Sie prüfen, Reflexion, weil es Ihnen erlaubt, eine Instanz einer Klasse durch seinen Namen Zeichenfolge zu erstellen.

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

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