Exécuter un constructeur dérivé avant le constructeur de base en C #
Mon problème, c'est que je voudrais faire passer un objet d'une classe dérivée, mais cela doit être fait avant le constructeur de classe de base, depuis la classe de base immédiatement appel de la classe dérivée de Start()
méthode qui utilise l'objet.
Voici un extrait de la classe de base, (renommé de BarcodeScanner pour des raisons de commodité).
public abstract class MyBase
{
public MyBase()
{
if (Initialize())
this.Start();
}
public abstract bool Initialize();
public abstract void Start();
}
Voici la classe dérivée que je suis en train de créer.
class MyDerived : MyBase
{
private string sampleObject;
public MyDerived (string initObject)
{
sampleObject = initObject;
}
public override bool Initialize()
{
return GetDevice();
}
public override void Start()
{
Console.WriteLine("Processing " + sampleObject.ToString());
}
}
Je doute que vous pouvez faire C# exécuter un dérivé constructeur avant le constructeur de base; donc, je suis vraiment à la recherche d'une solution pour passer d'un objet de la classe dérivée avant que l'objet est utilisé.
J'ai contourné en mettant de l'Initialiser/Start si le bloc à l'intérieur de la MyDerived
constructeur. Cependant, il existe d'autres classes dérivant de la classe de base; j'ai donc fini par avoir à répéter ce bloc d'Initialiser/code de Départ dans chaque classe dérivée. J'aimerais voir une alternative à la modification de la classe de base.
source d'informationauteur James
Vous devez vous connecter pour publier un commentaire.
Ce que vous essayez de faire est impossible en C#. Un constructeur dans une classe de base doit être exécuté avant que le constructeur d'une classe dérivée sinon il y aurait un risque de corrompre l'état de l'objet. Un objet enfant doit être en mesure de supposer que sa base est entièrement construit et disponible.
À mon humble avis, votre conception est erronée. Il ne faut pas commencer le processus à partir de l'intérieur du constructeur. Votre consommation de code devrait appeler explicitement la méthode Start() lorsque requis.
Je voudrais retravailler votre dessin afin de l'Initialiser (et potentiellement Start() - si j'avais normalement ce sera une méthode publique qui est appelé par l'utilisateur) sont appelées après la construction.
Si vous faites un BarcodeScanner, vous pourriez le faire la première fois que vous allez à la numérisation. Paresseux-initialiser vos membres en utilisant les données de la classe dérivée.
Cela va résoudre votre problème, pas de réel changement dans les usages de l'utilisateur.