0

我創建了幾個不同的自定義控制,其中的每一個實現不同基地控件的類繼承,但他們都將被添加到該他們一些共同的特性和功能。所以我想把這些共同的屬性(與他們共同的getter和setter)和功能的重複放到一個抽象類中。但是我很難包裝我的頭腦,如何構建控件及其基礎,以允許我的抽象類和基礎Web控件的實現。誰能幫我嗎?設計我的自定義控制

一些控件我建立

public class AssetDataStringControl : TextBox 
public class AssetDataIntegerControl : TextBox 
public class AssetDataUrlControl : CompositeControl 
public class AssetDataListBoxControl : ListBox 
public class AssetDataDropDownControl : DropDownList 

我的抽象類

public abstract class AssetDataInputControlBase<T> : Control, 
    IAssetDataInputControl<T> 
{ 
    protected virtual int AssetId 
    { 
     get 
     { 
      object o = ViewState["AssetId"]; 
      return o == null ? 0 : (int)o; 
     } 
     set { ViewState["AssetId"] = value; } 
    } 

    protected virtual AssetStructureField StructureField 
    { 
     get 
     { 
      object o = ViewState["StructureField"]; 
      return o == null ? null : (AssetStructureField)o; 
     } 
     set { ViewState["StructureField"] = value; } 
    } 

    public abstract T DataField { get; set; } 
} 

回答

0

忘記abstract。在我看來,.NET Web控制繼承鏈層的功能性,而不是強迫大量的實施對窮人的「最終產品」控制。我會看看我是否可以順其自然。這意味着從適當的類繼承來獲得構建基礎(雙關語)。

看起來像要構建複合Web控件。 請仔細閱讀有關System.Web.UI命名空間的文檔。考慮繼承System.Web.UI.CompositeControl。它給你一個孩子控制集合和一些內置的渲染。它實現了INamingContainer來管理子控件唯一ID。

只是一個想法,也許你可以讓一個類在運行時構造自定義合成(你能說factory pattern?)。 仔細閱讀有關System.Web.UI命名空間的文檔無論如何,基礎已經知道如何渲染組合。每個子控件(文本框,列表框等)都知道如何呈現自己。在工廠中,每個子控件都被賦予它的數據綁定。然後將它們注入到您的自定義CompositeControl構造函數中。

0

一個建議:讓AssetDataInputControlBase畫布,並把你想要它裏面的任何控制。作爲一個畫布,它會表現得很像一個控件。任何您需要的控件特定方法/屬性都需要向調用Control方法的ADICB添加方法。如果他們中有很多人,這個想法就不太好。

另外一個建議:你的控制可以實現具有返回類似AssetDataInputControlBase,只有在這種情況下ADICB將不執行控制,或其他任何方法的接口。相反,它只會有AssetID,AssetStructureField和DataField(以及其他需要的東西)。所以你的控件(比如AssetDataStringControl)只是擴展一個Control(比如TextBox),另外還包含對ADICB對象的引用。

這是假設ADICB的價值觀是相當獨立的控制(文本框,說)的。如果StructureField的get方法需要TextBox中的所有信息,並且需要以不同的方式得到它,那麼如果它是一個ListBox,那麼一切都將變得混亂起來,並且您需要一個更好的解決方案。如果不是,那麼您的控件只是TextBox,ListBox等的擴展,並添加了一個對ADICB對象的引用。一旦編寫了一個ADICB類,無論是複雜的,都可以被所有的控件使用。

這看起來像多重繼承一個很好的理由。