2010-05-12 68 views
0

我有以下頁面如何在實現者的方法之前執行基類的方法?

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 
} 

這是在impmement OfflineFactsheetBase所有頁面實施如下:

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

目前,只有GenericOfflineCommentary的ExtractPageData()正在觸發。我怎樣才能修改這首先運行OfflineFactsheetBase的ExtractPageData()然後GenericOfflineCommentary的?

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

回答

3

充分利用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,所以基本實現將始終執行

0

澄清後的修訂

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保護抽象,從基礎上的公共方法調用它,見this SO question and answer

+0

但這意味着我必須在每個實現者的ExtractPageData()中包含該行,不是嗎?編輯問題以反映這一點。 – DaveDev 2010-05-12 11:54:51

+1

我想我明白你的意思了,不知道如何在上面編輯的註釋中添加超鏈接以指向模板模式的示例 – 2010-05-12 12:14:48

相關問題