我有一个名为Foo的班级。这个类包含一个FooChildBase类型的子对象的集合,但我还有一个类型为FooChildTwo的类,它继承自FooChildBase。
Class Foo
Public Children As IList(Of FooChildBase)
End Class
Class FooChildBase
Public Info As String
End Class
Class FooChildTwo
Inherits FooChildBase
Public ExtraInfo As String
End Class
一切正常。现在我需要使用我的Foo对象的特化和额外的信息。
Class FooSpecial
Inherits Foo
Public SpecialInfo As String
End Class
Class FooChildSpecial
Inherits FooChildBase
Public SpecialChildInfo As String
End Class
我想要做的是让我的FooSpecial类将它的Children集合视为FooChildSpecial对象,但仍然可以向其添加FooChildTwo对象。这有可能吗?如果可以的话怎么办呢?
修改 我认为我原来的问题不正确。我需要FooChildSpecial类来包装Children集合中的任何对象以及额外的值,无论它们是FooChildBase还是FooChildTwo或XXX。
希望这是有道理的!如果需要进一步澄清,请告诉我。
詹姆斯
答案 0 :(得分:1)
为了让FooSpecialChild“包装”FooChildTwo,它必须从它继承或实现相同的接口(IFooChildTwo)。不幸的是,你不能有条件地继承或实施......它总是或永远不会。因此,您的FooSpecialChild类可以继承自FooChildTwo,但是它总是是FooChildTwo。如果它实现与FooChildTwo相同的接口,则相同。
您布置的设计模式将正常工作。由于FooChildSpecial和FooChildTwo都从相同的基类继承,并且列表属于该基类类型,因此它可以解决。当您从.Children属性中提取时,您只需要检查对象的类型。
将代码复制并粘贴到示例项目后,我可以成功地执行:
var foo = new Foo();
foo.Children = new List<FooChildBase>();
var special = new FooChildSpecial();
special.SpecialChildInfo = "special";
foo.Children.Add(special);
var two = new FooChildTwo();
two.ExtraInfo = "two";
foo.Children.Add(two);
这表明您可以将FooChildSpecial和FooChildTwo添加到原始列表中。
答案 1 :(得分:0)
“你好像是FooChildSpecial”对象是什么意思?您是指仅存在于FooChildSpecial对象中的访问方法吗?
在这种情况下,您需要将它们转换为FooChildSpecial。
但是,最好让FooSpecial将它们视为FooChildBase对象,但在FooChildSpecial和FooChildTwo中覆盖基本方法以获得两个子类的不同行为。
我也有一种感觉,你根本不需要FooSpecial课程,但我可能错了。我怀疑额外的信息和特殊信息可以合并到“信息”中,如果他们需要不同类型的信息来初始化不同类型的类。
答案 2 :(得分:0)
你可以用泛型来做你有一个包含类型T列表的基类。当你定义Foo和FooSpecial时,你会说明T是什么。