2014-05-23 28 views
0

对不起有些奇怪的标题。让我来描绘一下情况:继承:将Cast(Child-)UserControl转换为其基础版面

我有一个叫做TrafficInfraction的general usercontrol。 其他用户从此TrafficInfraction控制inherit。让他们叫他们超速驾驶&停车。德方案如下所示:

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

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

我知道它可能使用浅拷贝如下(fIntractionsflowlayoutpanel):

注意currTrafficInfractions是TrafficInfraction的集合(List Of)。它可以包含从trafficInfraction继承的用户控件:超速,停车,....(可能进一步派生的用户控件)。 currTrafficInfractions根据基本控件(TrafficInfraction)上定义的属性填充。该物业被命名为'Fine',并且是double。所有具有大于100的精细的用户控件(例如)都被添加到列表中。

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

但我不想要一个浅拷贝(我显然失去某些特性:工具提示,...),并希望对象本身。所以,我认为它会像这样工作:

 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继承)的位置不同。

问题:如何将usercontrol转换/转换为其基本用户控件的布局。并将其正确显示为TrafficInfraction给用户(没有在SpeedingParking中声明的额外控制)?

注意:TrafficInfraction implements IClonable。这可能是.Clone取得一些成功的原因。

+1

什么是'currTrafficInfractions'? – Igor

+0

更新了问题:currTrafficInfractions是Trafficinfractions的集合。 – User999999

+0

拥有并由谁填充? – Igor

回答

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只在基类实现将工作一样以及将子类实例复制到新的基类实例的副本构造函数。

+0

然而'.Clone'部分工作。它只拒绝复制/克隆一些基本属性(Tooltips,...)。我知道我可以做一个深层复制,但我对它可能具有的性能影响充满恐惧。 – User999999

+0

@svranken嗯,我只是检查了文档,它看起来不像'UserControl'是'ICloneable',那么在你的'TrafficInfraction'类中实现的呢? – Mark

+0

这是正确的。我忘了在问题中提到这一点。我会尽快添加它(+ 1虽然为努力!) – User999999