背景
我在父/子关系中有很多对象,如下所示:
YearNode
有一些孩子QuarterNode
QuarterNode
有一些孩子TypeNode
TypeNode
有一些孩子ReportsNode
这种结构的消费者是相当愚蠢的:它不知道(或关心)结构,它只是通过节点及其子节点(通过递归将随机发送到树视图中)环)
为了尝试实现这一点,我创建了以下界面
Public Interface IHaveChildren
.. bunch of properties ...
ReadOnly Property Children As ICollection(Of IHaveChildren)
End Interface
这是我上面提到的xxxNode对象实现的。 这是有效的,消费者不知道(或关心)它拥有什么类型的Node,只是它有一个应该循环的Children属性。
要求
目前结构年份> Qtr>输入>报告未被强制执行,因为它们都是IHaveChildren
您可以向ReportNode
添加YearNode.Children
。
为了使代码中的预期结构明确(以防止错误/使其更容易理解),我想强制执行该结构。
因此,例如,只有QuarterNode
可以添加到YearNode
个孩子,但消费者仍应将其视为相同。
对于YearNode
我尝试了这个:
Public Overloads ReadOnly Property Children As ICollection(Of QuarterNode) Implements IHaveChildren.Children
Get
...
我希望这可以,QuarterNode
实现IHaveChildren
,但这会给我一个错误
'儿童'无法实施儿童'因为没有匹配 界面上的属性' IHaveChildren'。
意思是,据我所知,即使ICollection(Of QuarterNode)
实现ICollection(Of IHaveChildren)
,返回类型QuarterNode
也无法与界面中预期的IHaveChildren
匹配。
其他方法
我想我会尝试一个基类,Node Classes将继承并覆盖指定用户的Children方法
Public MustInherit Class Node
Public MustOverride ReadOnly Property Children As ICollection(Of Node)
End Class
Public Class NodeYear
Inherits Node
Public Overloads Overrides ReadOnly Property Children As ICollection(Of NodeQuarter)
Get
.. impl ..
End Get
End Property
End Class
但这给出了错误
Public Overrides Overloads ReadOnly Property Children As System.Collections.Generic.ICollection(Of NodeYear)'无法覆盖 ' Public MustOverride ReadOnly Property Children As System.Collections.Generic.ICollection(Of Node)'因为他们不同 通过他们的返回类型。
所以基本上和以前一样。
我考虑创建我自己的ICollection实现,它覆盖Add方法只接受指定的Type但返回一个Node或IHaveChildren,但这似乎有点过分。
我考虑过将Children
属性后面的局部变量更改为特定类型,但将属性保留给Node或IHaveChildren,但这看起来并不像是一种智能方法(即使它不起作用&#&# 39;从方法签名中暴露我的意图,并提出问题)
我也在寻找SO问题而没有找到任何回答我问题的问题 我想做的是什么,如果是这样的话怎么样? 或者我需要考虑不同的方法吗?