实现接口方法但返回更具体的类型

时间:2017-02-21 16:08:33

标签: vb.net inheritance

背景

我在父/子关系中有很多对象,如下所示:

  • 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问题而没有找到任何回答我问题的问题 我想做的是什么,如果是这样的话怎么样? 或者我需要考虑不同的方法吗?

0 个答案:

没有答案