簡體   English   中英

如何在實現者的方法之前執行基類的方法?

[英]How to Execute Base Class's Method Before Implementors's Method?

我有以下頁面

public partial class GenericOfflineCommentary : OfflineFactsheetBase
{
}

其中OfflineFactsheetBase定義為

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具有以下virtual方法:

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

在所有影響OfflineFactsheetBase的頁面中都實現了該代碼,如下所示:

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

當前,只有GenericOfflineCommentary的ExtractPageData()被觸發。 我怎么能修改此先運行OfflineFactsheetBase的ExtractPageData(),然后GenericOfflineCommentary的?

編輯:我試圖避免在每個實現者中調用base.ExtractPageData() 這可能嗎?

使ExtractPageData方法成為非虛擬方法,並調用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
}

派生類將僅覆蓋ExtractPageDataInternal ,而不是ExtractPageData ,因此將始終執行基本實現。

澄清后修訂

 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.
    }
}

OfflineFactsheetBase是抽象的嗎? 如果是這樣,請使ExtractPageData受保護的抽象並從基礎上的公共方法調用它,請參閱此SO問題和解答

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM