2010-05-12 4 views
0

J'ai la page suivanteComment exécuter la méthode de la classe de base avant la méthode des implémenteurs?

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() 
{ 
    // get stuff relevant to all pages that impmement OfflineFactsheetBase 
} 

qui est mis en œuvre dans toutes les pages qui impmement OfflineFactsheetBase comme suit:

public partial class GenericOfflineCommentary : OfflineFactsheetBase 
{ 
    public override void ExtractPageData() 
    { 
      // get stuff relevant to an OfflineCommentary page. 
    } 
} 

Actuellement, seul le GenericOfflineCommentary ExtractPageData() est en cours d'exécution. Comment est-ce que je peux modifier ceci pour exécuter d'abord le ExtractPageData (OfflineFactsheetBase) et ensuite GenericOfflineCommentary?

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

Répondre

3

Faire la non-virtuelle méthode ExtractPageData et appeler une méthode virtuelle ExtractPageDataInternal:

public void ExtractPageData() 
{ 
    // get stuff relevant to all pages that impmement OfflineFactsheetBase 

    // base implementation 
    ... 

    // call derived class implementation 
    this.ExtractPageDataInternal(); 
} 

protected virtual void ExtractPageDataInternal() 
{ 
    // implementation to be defined by derived class 
} 

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

0

Révisée 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 () 
    { 
     // get stuff relevant to all pages that implement OfflineFactsheetBase 
     // ....blah... 
     InternalExtractPageData (); 
    } 
    // Could be abstract if the class where 
    protected virtual void InternalExtractPageData () 
    { 
     // get stuff relevant to all pages that impmement OfflineFactsheetBase 
    } 
} 

public partial class GenericOfflineCommentary : OfflineFactsheetBase 
{ 
    public override void ExtractPageData () 
    { 
     // get stuff relevant to an OfflineCommentary page. 
    } 
} 

est abstrait OfflineFactsheetBase? Si oui, assurez ExtractPageData il protégé abstrait et appeler à partir d'une méthode publique sur la base, voir this SO question and answer

+0

mais cela signifie que je dois inclure cette ligne dans ExtractPageData() de chaque implémenteur, n'est-ce pas? Question éditée pour refléter ceci. – DaveDev

+1

Je pense que je vois ce que vous voulez dire, ne sais pas comment ajouter des liens hypertexte dans un commentaire ainsi édité ci-dessus pour pointer vers un exemple du modèle Template –

Questions connexes