覆盖接口字段

时间:2019-03-14 22:45:10

标签: vb.net class interface properties override

这里是新的编码器,因此,如果这确实是一个显而易见的问题,我要提前致歉。我制作了一个名为IState的接口,IState的属性之一是Outputs,这是IState的列表。我计划使用大约4个不同的类来实现IState接口。但是,在两个类中,我希望能够覆盖Outputs属性,并将其作为字符串列表而不是IStates列表。这是否可能,或者有解决此问题的聪明方法?

下面是IState的代码。

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

2 个答案:

答案 0 :(得分:1)

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

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用作该接口,则会遇到递归问题,因此我认为您可能不走运。您基本上是在要求能够实现一个接口而不执行它。答案是否定的,你不能。

答案 1 :(得分:0)

接口是属性,方法和事件及其签名(属性类型,方法参数顺序和类型等)的规范。您可以使用泛型作为动态定义新接口的方法,而泛型接口确实有用途,但是您会遇到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

另一种方法是通过将Outputs类型移动到从IState继承而没有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

这样做的好处是您可以传递将以上任何接口实现为| pk | sk | GSI1 PK | GSI1 SK | | 12345 | metadata | | | Age:13 | Last name: Singh | Name:Rohan | ... | 12345 | schoolMeta | SchoolName: DPS | DPS#class5 | className:5 | 的类实例。如果需要访问Outputs属性,则可以尝试将值强制转换为IOutputXXXX类型之一。