Интерфейс - это спецификация свойств, методов и событий и их сигнатур (тип свойства, порядок и тип аргумента метода и т. Д.).Вы можете использовать дженерики как способ динамического определения нового интерфейса, и универсальные интерфейсы там действительно используются, но вы сталкиваетесь с проблемой, что 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
.Если вам нужно получить доступ к свойству Outputs, вы можете попытаться привести значение к одному из типов IOutputXXXX.