Erstellen Sie eine Instanz der abgeleiteten Klasse durch die der Basisklasse ohne hardcoding

Mein problem ist wie folgt:

Ich habe eine base-Klasse muss Abstrakt sein. Es hat mehrere abgeleitete Klassen, jede mit Ihren eigenen besonderen Eigenschaften, die im Eigenschaften-Mitglied.

Ich muss in der Lage sein, erstellen Sie eine neue Instanz einer von dieser abgeleiteten Klassen, also alle Mitglieder sind gleichwertig, aber ändern Sie die neue Instanz nicht ändern, das original.

Endlich, ich will es tun, ohne zu fest in jeder abgeleiteten Typ der Basisklasse. (Das wäre, zugegeben, die einfachste Lösung sein, aber das ist nicht der Punkt)

Alle abgeleiteten Klassen gerecht "ist-ein" - Beziehung zur Basisklasse.

Hier ist der code:

public abstract class BaseClass
{
    //Default properties here
    int x, y, z, ...;

    //Custom made class to hold custom properties
    protected Attributes Properties;

    public BaseClass createNewInstance()
    {
        return createNewInstanceStep1();
    }

    //Each derived class implements their own version of this,
    //to handle copying any custom members contained in Properties.
    protected abstract BaseClass createNewInstanceStep2();

    protected BaseClass createNewInstanceStep1()
    {
        BaseClass newInstance = new BaseClass(); //<- Doesn't work because class is abstract

        //Copy default properties
        newInstance.x = x;
        newInstance.y = y;
        newInstance.z = z;

        //Call the new instance's step 2 method, and return the result.
        return newInstance.createNewInstanceStep2();
    }
}

Das Problem bei diesem code ist die BaseClass newKeyFrame = new BaseClass(); Linie. Als die Klasse ist Abstrakt, Sie kann nicht erstellen Sie eine Instanz von Ihr.

Das problem ist, dass ich in der Lage sein müssen den Konstruktor aufrufen, was den Typ der abgeleiteten Klasse ist, wie Sie alle anderen code in Ihre Konstruktoren, die nicht geteilt werden kann.

Ich habe gehört, dass mit der Spiegelung könnte eine praktikable Lösung, allerdings habe ich keine Ahnung wie.

Wie kann ich dies lösen, ohne fest in einem Fall, für jeden abgeleiteten Typ?

InformationsquelleAutor Ipquarx | 2013-10-30
Schreibe einen Kommentar