vacio predeterminado polimorfico metodo instancias herencia espaƱol declaracion constructores c# constructor abstract-class derived-class

predeterminado - herencia de constructores c#



Ejecute un constructor derivado antes del constructor base en C# (3)

Mi problema aquí es que me gustaría pasar un objeto a una clase derivada, pero debe hacerse antes del constructor de la clase base, ya que la clase base llamará inmediatamente al método Start() la clase derivada que usa el objeto.

Aquí hay un extracto de la clase base, (renombrado de BarcodeScanner por conveniencia).

public abstract class MyBase { public MyBase() { if (Initialize()) this.Start(); } public abstract bool Initialize(); public abstract void Start(); }

Aquí está la clase derivada que estoy creando.

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

Dudo que pueda hacer que C # ejecute un constructor derivado antes del constructor base; así que realmente estoy buscando una solución para pasar un objeto a la clase derivada antes de que se use el objeto.

He solucionado esto al colocar el bloque Initialize / Start if dentro del constructor MyDerived . Sin embargo, hay otras clases que se derivan de la clase base; así que terminé teniendo que repetir este bloque de Inicializar / Código de inicio en cada clase derivada. Me gustaría ver una alternativa a la modificación de la clase base.


En mi humilde opinión, tu diseño es incorrecto. No debe iniciar el proceso desde el constructor. Su código de consumo debe llamar explícitamente al método Start () cuando sea necesario.


Lo que estás tratando de hacer es imposible en C #. Un constructor en una clase base debe ejecutarse antes que el constructor de cualquier clase derivada; de lo contrario, podría haber un estado de objeto corrupto. Un objeto hijo debe ser capaz de asumir que su base está completamente construida y disponible.


Retrabajaría su diseño para que Initialize (y potencialmente Start () - aunque normalmente haría que sea un método público llamado por el usuario) se llame después de la construcción.

Si está creando un BarcodeScanner, puede hacerlo la primera vez que vaya a escanear. Inicialmente, inicie de forma lenta sus miembros utilizando los datos de la clase derivada.

Esto solucionará su problema, sin un cambio real en el uso del usuario.