Переопределение полей интерфейса - PullRequest
0 голосов
/ 15 марта 2019

Новый кодер здесь, поэтому я прошу прощения заранее, если это действительно очевидный вопрос.Я создал интерфейс под названием IState, и одним из свойств IState является Outputs, который представляет собой список IStates.Я планирую иметь около 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 ]

1 голос
/ 15 марта 2019

То, что вы предлагаете, не может быть выполнено даже с помощью свойства, а не поля.Если ваш интерфейс объявляет член определенного типа, то любой тип, который реализует этот интерфейс, должен реализовывать этот член этого типа.Вы можете сделать свой интерфейс универсальным, как это:

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

0 голосов
/ 15 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...