新的编码器,因此,如果这确实是明显的问题,我会提前道歉。我制作了一个称为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类型之一。