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类,无论是复杂的,都可以被所有的控件使用。

这看起来像多重继承一个很好的理由。