0 votes

Comment exécuter la méthode de la classe de base avant la méthode des implémenteurs ?

Je possède la page suivante

public partial class GenericOfflineCommentary : OfflineFactsheetBase
{
}

OfflineFactsheetBase est défini comme

public class OfflineFactsheetBase : System.Web.UI.Page
{
    public OfflineFactsheetBase()
    {
        this.Load += new EventHandler(this.Page_Load);
        this.PreInit += new EventHandler(this.Page_PreInit);
    }

    protected void Page_PreInit(object sender, EventArgs e)
    {
        if (Request.QueryString["data"] != null)
        {
            this.PageData = StringCompressor.DecompressString(Request.QueryString["data"]);
            this.ExtractPageData();
        }
    }
}

OfflineFactsheetBase a la méthode virtual suivante :

public virtual void ExtractPageData()
{
    // Obtenir des informations pertinentes pour toutes les pages implémentant OfflineFactsheetBase
}

qui est implémenté dans toutes les pages implémentant OfflineFactsheetBase comme suit :

public partial class GenericOfflineCommentary : OfflineFactsheetBase
{
    public override void ExtractPageData()
    {
            // Obtenir des informations pertinentes pour une page OfflineCommentary.
    }
}

Actuellement, seule la méthode ExtractPageData() de GenericOfflineCommentary est appelée. Comment puis-je modifier cela pour d'abord exécuter ExtractPageData() de OfflineFactsheetBase, puis celui de GenericOfflineCommentary ?

edit: J'essaie d'éviter d'avoir à appeler base.ExtractPageData() dans chaque implémenteur. Est-ce possible ?

3voto

Thomas Levesque Points 141081

Rendez la méthode ExtractPageData non virtuelle, et appelez une méthode virtuelle ExtractPageDataInternal :

public void ExtractPageData()
{
    // obtenir des éléments pertinents pour toutes les pages qui implémentent OfflineFactsheetBase

    // implémentation de base
    ...

    // appeler l'implémentation de la classe dérivée
    this.ExtractPageDataInternal();
}

protected virtual void ExtractPageDataInternal()
{
    // implémentation à définir par la classe dérivée
}

La classe dérivée ne remplacera que ExtractPageDataInternal, pas ExtractPageData, donc l'implémentation de base sera toujours exécutée

0voto

Simon Wilson Points 2801

Révisé après clarification

 public class OfflineFactsheetBase : System.Web.UI.Page
{
    public OfflineFactsheetBase ( )
    {
        this.Load += new EventHandler ( this.Page_Load );
        this.PreInit += new EventHandler ( this.Page_PreInit );
    }

    protected void Page_PreInit ( object sender, EventArgs e )
    {
        if ( Request.QueryString [ "data" ] != null )
        {
            this.PageData = StringCompressor.DecompressString ( Request.QueryString [ "data" ] );
            this.ExtractPageData ( );
        }
    }

    public void ExtractPageData ( )
    {
        // obtenir des éléments pertinents pour toutes les pages implémentant OfflineFactsheetBase
        // ....blah...
        InternalExtractPageData ( );
    }
    // Pourrait être abstrait si la classe où
    protected virtual void InternalExtractPageData ( )
    {
        // obtenir des éléments pertinents pour toutes les pages implémentant OfflineFactsheetBase
    }
}

public partial class GenericOfflineCommentary : OfflineFactsheetBase
{
    public override void ExtractPageData ( )
    {
        // obtenir des éléments pertinents pour une page de commentaire hors ligne.
    }
}

OfflineFactsheetBase est-il abstrait ? Si oui, rendre ExtractPageData protected abstract et l'appeler depuis une méthode publique sur la classe de base, voir cette question et réponse SO

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