2013-04-22 52 views
1

我正在使用ASP.NET 4.5開發ASP.NET Webforms網站。 我有,我用我的方式母版頁,但我想要的頁面類從另一個SitePage類繼承,爲此,代碼如下:如何防止在使用自定義基頁面類時覆蓋Page_Load方法

public abstract class SitePage : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // common logic here 
     Page_LoadImpl(sender, e); 
    } 

    protected abstract void Page_LoadImpl(object sender, EventArgs e); 
} 

頁面的類會再看看這樣的:

public partial class MyPage: SitePage 
{ 
    protected override void Page_LoadImpl(object sender, EventArgs e) 
    { 
     //page specific logic here 
    } 
} 

我來自Java的背景,我如何使我的SitePage Page_Load方法最終,不可重寫?我知道我可以使用嵌套母版頁來實現相同的功能,但我不想重新定義頁面的內容。 謝謝

回答

0

的方法,如果它被標記爲 「虛擬」 或 「抽象」 是隻重寫。

你的方法「Page_Load」沒有標記這些關鍵字,因此它已經是不可覆蓋的。

+0

好吧,我明白了,但是我可以在MyPage類中放入一個 'protected void Page_Load(object sender,EventArgs e)' 。我想這被視爲默認的新方法,從BasePage中隱藏一個,正確的?在那種情況下,我沒有辦法阻止這種情況發生,對吧? – kfc 2013-04-22 10:23:39

+0

這是100%正確!編譯器會發出警告。此警告可以通過在第二個Page_Load上使用關鍵字「new」來抑制。 – 2013-04-22 11:21:31

0

使用sealed關鍵字,其作用與final相同Java

實施例從MSDN

class X 
{ 
    protected virtual void F() { Console.WriteLine("X.F"); } 
    protected virtual void F2() { Console.WriteLine("X.F2"); } 
} 
class Y : X 
{ 
    sealed protected override void F() { Console.WriteLine("Y.F"); } 
    protected override void F2() { Console.WriteLine("X.F3"); } 
} 
class Z : Y 
{ 
    // Attempting to override F causes compiler error CS0239. 
    // protected override void F() { Console.WriteLine("C.F"); } 

    // Overriding F2 is allowed. 
    protected override void F2() { Console.WriteLine("Z.F2"); } 
} 
+0

我會,但Page_Load不是一個覆蓋。從我知道密封只能用於重寫的方法,我是對嗎? – kfc 2013-04-22 10:14:47

0
public abstract class SitePage : Page 
{ 
    sealed protected void Page_Load(object sender, EventArgs e) 
    { 
     // common logic here 
     Page_LoadImpl(sender, e); 
    } 

    protected abstract void Page_LoadImpl(object sender, EventArgs e); 
} 
0

覆蓋SupportAutoEvents。

保護密封覆蓋BOOL SupportAutoEvents { 得到 { 返回FALSE; } }