programacion C#¿Llama al constructor de la clase base después del propio constructor?




que es un constructor en c# (3)

¿Cómo puedo llamar al constructor de la clase base después de haber llamado a mi propio constructor?

El problema es que el constructor de la clase base llama a un método abstracto (invalidado en la subclase), que necesita acceder a la variable x , inicializada en el constructor de la subclase?

Código de ejemplo corto:

abstract class BaseClass
{
    protected string my_string;

    protected abstract void DoStuff();

    public BaseClass()
    {
        this.DoStuff();
    }
}

class SubClass : BaseClass
{
    private TextBox tb;

    public SubClass()
        : base()
    {
        this.my_string = "Short sentence.";
    }

    protected override void DoStuff()
    {
        // This gets called from base class' constructor
        // before sub class' constructor inits my_string
        tb.Text = this.my_string;
    }
}

Edición: Basado en las respuestas, obviamente no es posible. ¿Hay una forma automática de llamar a this.DoStuff(); en cada objeto de la SubClass una vez que se crean? Por supuesto que podría añadir esto. this.DoStuff(); después de todas las otras líneas en el constructor de la subclase, pero con alrededor de 100 de estas clases, se siente estúpido. ¿Alguna otra solución, o debo usar el manual?


Answer #1

Usted no puede

Además, en general, no debe llamar a métodos virtual en un constructor. Ver esta answer

Dependiendo de su código real y no del simple ejemplo que escribió, podría pasar valores como parámetros del constructor base y del método DoStuff . Por ejemplo:

abstract class BaseClass
{
    private string my_string;

    protected abstract void DoStuff(string myString);

    public BaseClass(string myString)
    {
        this.my_string = myString;
        this.DoStuff(this.my_string);
    }
}

class SubClass : BaseClass
{
    private TextBox tb;

    public SubClass()
        : base("Short sentence.")
    {
    }

    protected override void DoStuff(string myString)
    {
        tb.Text = myString;
    }
}

Si no es posible con su código real, entonces escribir múltiples DoStuff() hará el trabajo. También recuerde sellar su clase de SubClass para que nadie más pueda introducir errores modificando el método DoStuff otra ocasión.


Answer #2

¿Hay alguna razón por la que no pueda construir una clase antes de que su constructor realmente se ejecute? Requiere un mayor nivel de responsabilidad sobre cómo se crea la clase derivada y, probablemente, no es una buena práctica, pero parece funcionar.

abstract class BaseClass {
    protected string my_string;

    protected abstract void DoStuff();

    public BaseClass() {
        this.DoStuff();
    }
}

class SubClass: BaseClass {
    TextBox tb;

    bool Constructed = false;
    void Constructor() {
        if (!Constructed) {
            Constructed = true;
            this.my_string = "Short sentence.";
        }
    }
    public SubClass()
        : base() {
        Constructor();
    }

    protected override void DoStuff() {
        Constructor();
        // This gets called from base class' constructor
        // before sub class' constructor inits my_string
        tb.Text = this.my_string;
    }
}

Answer #3

No llamaría a un método abstracto en el constructor, ya que puede ocurrir que el constructor de la instancia que invoca el método no se haya ejecutado.

Cuando se llama a un método virtual, el tipo real que ejecuta el método no se selecciona hasta el tiempo de ejecución. Cuando un constructor llama a un método virtual, es posible que el constructor de la instancia que invoca el método no se haya ejecutado. Para corregir una violación de esta regla, no llame a los métodos virtuales de un tipo desde dentro de los constructores del tipo.

http://msdn.microsoft.com/en-us/library/ms182331%28v=vs.80%29.aspx





superclass