簡體   English   中英

ASP.NET中用戶控件和頁面的公共基類

[英]Common base class for usercontrols and pages in ASP.NET

現在,我有我的網頁它繼承一個基類System.Web.UI.Page和我的用戶控件另一個基類繼承其System.Web.UI.UserControl ,這些類包含了同樣的方法。 由於C#不支持多重繼承,因此我無法將這兩個類合並為一個繼承Page和UserControl的類。

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

我正在考慮創建一個接口,讓兩個基類調用包含接口實現的第三個類。 有沒有更好的方法,所以當我添加一個新方法時,我不必在三個地方做到這一點(即使實現僅在第三類)。

如果您使用的是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();

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

我定義了空接口

public interface ISecurableWebObject
    {
    }

然后我定義了具有上述接口的extesion方法的類

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

我在Page和WebUserControl類中繼承了ISecurableWebObject,因此dublicate定義已經消失了。

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

嗯......聽起來像是着名的Helper類的用法,基本上類似於

public static class StringHelper
{

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

}

並稱他們為

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

雖然我經常非常關心擁有太多的這些助手,因為他們真的不記得用其中的靜態方法進行程序化編程。 另一方面,您描述的功能(在一些擴展UserControl和Page的基類中)通常屬於這種類型。

我經常做的是擁有一個StringHelper和一個相應的StringExtender,其內部邏輯調用Helper類的靜態方法。 通過這種方式,您可以使用新C#擴展方法的功能,或者像往常一樣直接通過靜態類。

暫無
暫無

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

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