C# Language Appeler des méthodes virtuelles dans un constructeur


Exemple

Contrairement à C ++ en C #, vous pouvez appeler une méthode virtuelle à partir du constructeur de classe (OK, vous pouvez aussi en C ++, mais le comportement est surprenant au premier abord). Par exemple:

abstract class Base
{
    protected Base()
    {
        _obj = CreateAnother();
    }

    protected virtual AnotherBase CreateAnother()
    {
        return new AnotherBase();
    }

    private readonly AnotherBase _obj;
}

sealed class Derived : Base
{
    public Derived() { }

    protected override AnotherBase CreateAnother()
    {
        return new AnotherDerived();
    }
}

var test = new Derived();
// test._obj is AnotherDerived

Si vous venez d'un arrière-plan C ++, c'est surprenant, le constructeur de la classe de base voit déjà la table des méthodes virtuelles de la classe dérivée!

Attention : la classe dérivée n'est peut-être pas encore complètement initialisée (son constructeur sera exécuté après le constructeur de la classe de base) et cette technique est dangereuse (il y a aussi un avertissement StyleCop pour cela). Habituellement, cela est considéré comme une mauvaise pratique.