覆盖接口字段



新的编码器,因此,如果这确实是明显的问题,我会提前道歉。我制作了一个称为ISTATE的接口,并且ISTATE的属性之一是输出,这是ISTATE的列表。我计划拥有大约4个不同的类,这些类将实现ISTATE接口。但是,在其中两个类中,我希望能够覆盖输出属性,并将其作为字符串列表,而不是ISTATE的列表。这是可能的,还是有一种巧妙的方式可以解决?

以下是ISTATE的代码。

Public Interface IState
    Property Name As String
    Property Outputs As List(Of IState)
    Property OnScreen As String
    Sub Update()
    Sub OnSpace()
End Interface

即使使用属性而不是字段,您的建议也无法完成。如果您的接口声明特定类型的成员,则任何实现接口的类型都必须实现该类型的成员。您可以使您的接口通用:

Public Interface IState(Of T)
    Property Name As String
    Property Outputs As List(Of T)
    Property OnScreen As String
    Sub Update()
    Sub OnSpace()
End Interface

,然后任何实现该接口的类都可以指定T本身。如果您希望T成为该界面,那么您会遇到递归问题,所以我认为您可能会失去运气。您基本上要求能够实现界面而无需实现界面。答案是否,你不能。

接口是属性,方法和事件及其签名(属性类型,方法参数顺序和类型等)的规范。您可以使用generics作为动态定义新接口和通用接口确实有用途的方式,但是您会遇到IGeneric(Of Type1)IGeneric(OF Type2)不同的问题。

除了要允许Outputs属性为List(Of IState)List(Of String)外,还不知道您的特定用法要求,因此很难构想一个通用解决方案。

一个通用的解决方案是将Outputs类型的约束减少为ILIST。这将使您返回List(Of IState)List(Of String)。但是,实现也将免费返回任何实现Ilist接口的其他类型。

Public Interface IState
    Property Name As String
    Property Outputs As IList
    Property OnScreen As String
    Sub Update()
    Sub OnSpace()
End Interface

另一种方法是通过将其移动到没有IState的新接口类型中来维持Outputs类型的强限制,而无需Outputs属性。

Public Interface IState
    Property Name As String
    Property OnScreen As String
    Sub Update()
    Sub OnSpace()
End Interface
Public Interface IOutputString : Inherits IState
    Property Outputs As List(Of String)
End Interface
Public Interface IOutputIState : Inherits IState
    Property Outputs As List(Of IState)
End Interface

这可以通过将上述任何接口作为IState实现的类实例传递。如果您需要访问输出属性,则可以尝试将值施加到IOutputxxxx类型之一。

最新更新