Как выполнить метод базового класса перед методом реализации? - PullRequest
0 голосов
/ 12 мая 2010

У меня есть следующая страница

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?

edit: Я пытаюсь избежать необходимости вызывать base.ExtractPageData() в каждом разработчике. Это возможно?

Ответы [ 2 ]

3 голосов
/ 12 мая 2010

Сделайте метод 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 голосов
/ 12 мая 2010

Пересмотрено после уточнения

 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 и ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...