继承:将(子) - UserControl转换为其Base的布局

时间:2014-05-23 13:35:11

标签: vb.net inheritance user-controls

对不起有点奇怪的标题。让我描述一下情况:

我有一个名为TrafficInfraction的general usercontrol。 来自此TrafficInfraction的其他2个用户控件inherit。我们称他们为Speeding&停车处。 De计划如下:

TrafficInfraction
      Speeding (Inherits from TrafficInfraction + Has 2 extra buttons)
      Parking (Inherits from TrafficInfraction + Has 1 extra textbox & 1 extra button)

添加运行时我想cast Speeding/Parking用户控件TrafficInfraction类型fIntractions的用户控件(在指定表单上,我不需要额外的控件)。

我知道可以使用浅拷贝如下(flowlayoutpanel(List Of)):

注意 currTrafficInfractions是TrafficInfraction的集合double。它可以包含oridinary trafficInfraction&用户控件继承trafficInfraction:超速,停车,....(可能进一步派生的用户控件)。 currTrafficInfractions基于base-Control(TrafficInfraction)上定义的属性填充。该属性名为“Fine”,为 For Each infra As TrafficInfraction In currTrafficInfractions fInfractions.Controls.Add(infra.Clone()) Next 。精细大于100的所有用户控件(例如)都会添加到列表中。

        For Each infra As TrafficInfraction In currTrafficInfractions
            fInfractions.Controls.Add(Ctype(infra,TrafficInfraction))
        Next

然而我不想要一个浅色的副本(因为我显然失去了某些属性:工具提示,......)并且想要对象本身。所以我认为它会像这样工作:

        For Each infra As TrafficInfraction In currTrafficInfractions
            fInfractions.Controls.Add(infra)
        Next

.Clone

但我被证明是错的。布局不会改变(与TrafficInfraction的效果不同)。我仍然看到那些额外的控制。简单地隐藏它们是行不通的。由于控制的位置(继承自TrafficInfraction)在Speeding& amp;停车场。

问题:如何将用户控件转换/转换为其base-usercontrol的布局。并将Speeding正确显示给用户(没有ParkingTrafficInfraction中声明的额外控件)?

注意: IClonable实施.Clone。这可能是{{1}}取得一些成功的原因。

1 个答案:

答案 0 :(得分:1)

转换(CType)和克隆不会改变对象的类型,只会改变对它的引用类型,这就是为什么你仍然会看到子类布局。您必须在基类TrafficInfraction上创建copy constructor(该文章适用于C#,但也适用于VB.NET)。

Public Class TrafficInfraction
    Public Sub New(copy As TrafficInfraction)
       Me.SomeProperty = copy.SomeProperty
       Me.OtherProperty = copy.OtherProperty
       etc.
    End Sub
End Class

然后使用:

For Each infra As TrafficInfraction In currTrafficInfractions
    fInfractions.Controls.Add(new TrafficInfration(infra))
Next

<强>更新

正如评论中所讨论的,这个答案并不完全正确 - 仅在基类上实现的Clone与将子类实例复制到新的基类实例的复制构造函数一样。