2009-09-20 180 views
6

現在我的頁面有一個基類,它繼承System.Web.UI.Page,另一個基類用於繼承System.Web.UI.UserControl的usercontrols,這些類包含相同的方法。由於C#不支持多重繼承,因此我無法將這兩個類組合成繼承Page和UserControl的類。ASP.NET中用戶控件和頁面的公共基類

將功能保留在兩個基類中但是隻在一個地方實現這些方法的最佳方法是什麼?

我正在考慮製作一個接口,並讓兩個基類調用包含接口實現的第三個類。有沒有更好的方法,以便當我添加一個新的方法時,我不必在三個地方做(即使實現只在第三類中)。

+0

是否有任何理由你不只是在構造函數中創建一個接受HttpContext的幫助類?這將使您能夠執行查看查詢字符串和執行Response.Redirects等操作。 – nizmow 2009-12-14 05:12:24

+0

最初的問題是關於httpContext,它是關於在頁面和用戶控件之間乾的頁面基類(一種常見用例)中的自定義代碼。所討論的方法很可能是特定於業務邏輯的,與http上下文無關。 – 2010-09-14 16:04:08

回答

9

如果您使用的是C#3.0,則可以提供輔助方法作爲System.Web.UI.Control類的擴展方法,其中System.Web.UI.PageSystem.Web.UI.UserControl類都從中派生。

public static class ControlExtensions { 
    public static void DoSomething(this Control obj) { 
     // do something 
    } 
} 

PageUserControl

this.DoSomething(); 
+0

偉大的答案@Mehrdad! – ProfK 2009-09-20 12:11:42

1

嗯...聽起來像著名的Helper類的使用,基本類,如

public static class StringHelper 
{ 

    public static string Replace(...) 
    { 
     ... 
    } 

} 

,並要求他們像

string x = StringHelper.Replace(...); 

雖然我經常很擔心有太多的這些助手,因爲他們真的記得使用靜態方法進行程序編程。另一方面,你描述它的功能(在一些擴展UserControl和Page的基類中)通常是這種類型的。

然後我經常做的是有一個StringHelper和一個相應的StringExtender誰是邏輯裏面的調用Helper類的靜態方法。通過這種方式,您可以像平常一樣使用新的C#擴展方法的功能或直接通過靜態類。

3

我有完全相同的問題。這是我的解決方案。

我定義空接口

public interface ISecurableWebObject 
    { 
    } 

然後,定義了具有用於接口extesion以上方法

public static class ISecurableWebObjectExtender 
    { 
     public static bool ExtensionMetotX(this ISecurableWebObject obj) 
     { 
      return ...; 
     } 
    } 

我繼承ISecurableWebObject在網頁和WebUserControl類,以便dublicate定義已經類。

public partial class UcExample : System.Web.UI.UserControl, ISecurableWebObject 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if(this.ExtensionMetotX() == true) 
      { ... } 
     } 
    }