La création d'une instance de la classe dérivée par le biais de la classe de base sans le coder en dur

Mon problème est comme suit:

J'ai une classe de base qui doit être abstraite. Il possède plusieurs classes dérivées, chacun avec leurs propres propriétés qui sont contenus dans les Propriétés de membre.

J'ai besoin d'être en mesure de créer une nouvelle instance de l'une de ces classes dérivées, de sorte que tous les membres sont équivalentes, mais la modification de la nouvelle instance ne pas modifier l'original.

Enfin, je tiens à le faire sans avoir à coder en dur dans chaque type dérivé de la classe de base. (Ce qui serait, à vrai dire, la solution la plus simple, cependant, ce n'est pas le point)

Toutes les classes dérivées de satisfaire un "est-un" de la relation à la classe de base.

Voici le 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();
    }
}

Le problème, c'est le code de BaseClass newKeyFrame = new BaseClass(); ligne. Comme la classe est abstraite, vous ne pouvez pas en créer une instance.

Le problème est que j'ai besoin d'être en mesure d'appeler le constructeur de ce type de la classe dérivée est, car ils ont tous un code différent dans leurs constructeurs qui ne peuvent pas être partagés.

J'ai entendu dire que l'utilisation de la Réflexion pourrait être une solution viable, cependant je n'ai aucune idée de comment.

Comment puis-je résoudre ce sans avoir à coder en dur dans un cas pour chaque type dérivé?

OriginalL'auteur Ipquarx | 2013-10-30