5 votes

Classe abstraite, comment éviter la duplication du code ?

J'ai le code suivant

internal abstract class Base
{
    public DateTime Time;
    public string Message;
    public string Log;
    public abstract void Invoke(string message);
}

internal class SubA : Base
{
    public override void Invoke(string message)
    {
        Time = DateTime.Now;
        // Do A
    }
}

internal class SubB : Base
{
    public override void Invoke(string message)
    {
        Time = DateTime.Now;
        // Do B
    }
}

J'ai ces classes SubA et SubB qui héritent de la classe de base, vous pouvez voir que j'ai un code qui se répète lui-même et qui règle l'heure, y a-t-il un moyen de déplacer le réglage de l'heure vers la classe de base ?

0voto

Tragedian Points 12308

Il existe deux options pratiques, en fonction de la rigueur que vous souhaitez donner à vos contrats de code.

Vous pouvez déplacer la logique dans une méthode virtuelle et permettre aux types enfants de surcharger le comportement s'ils le souhaitent.

internal abstract class Base
{
    ...
    public virtual void Invoke(string message)
    {
        Time = DateTime.Now;
    }
}

internal class SubA : Base
{
    public override void Invoke(string message)
    {
        base.Invoke(message);
        // Do A
    }
}

internal class SubB : Base
{
    public override void Invoke(string message)
    {
        base.Invoke(message);
        // Do B
    }
}

Cela permet toutefois aux types dérivés de ne pas appeler du tout la méthode de base.

Si le fait que la fonctionnalité de base ne soit pas invoquée est catastrophique et que vous souhaitez avoir plus de certitude quant au comportement attendu, vous pouvez établir un contrat plus solide en prévoyant un point d'injection au milieu de la méthode de base :

internal abstract class Base
{
    ...
    public void Invoke(string message)
    {
        Time = DateTime.Now;
        this.InvokeCore(message);
    }

    protected abstract void InvokeCore(string message);
}

internal class SubA : Base
{
    public override void Invoke(string message)
    {
        // Do A
    }
}

internal class SubB : Base
{
    public override void InvokeCore(string message)
    {
        // Do B
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X