对不起有点奇怪的标题。让我描述一下情况:
我有一个名为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
正确显示给用户(没有Parking
或TrafficInfraction
中声明的额外控件)?
注意: IClonable
实施.Clone
。这可能是{{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
与将子类实例复制到新的基类实例的复制构造函数一样。