2011-08-04 2 views
2

Я интерфейс IDigitalState определяется какОграничение интерфейс для структур только в vb.net

Public Interface IDigitalState 

    ReadOnly Property Code As Integer 
    ReadOnly Property Name As String 

End Interface 

и структуру, которая реализует этот интерфейс

Public Structure DigitalState 
    Implements IDigitalState 

    Private ReadOnly mCode As Integer 
    Private ReadOnly mName As String 

    Public ReadOnly Property Code As Integer Implements IDigitalState.Code 
     Get 
      Return mCode 
     End Get 
    End Property 

    Public ReadOnly Property Name As String Implements IDigitalState.Name 
     Get 
      Return mName 
     End Get 
    End Property 

    Public Sub New(ByVal code As Integer, name As String) 

     mCode = code 
     mName = name 

    End Sub 

End Structure 

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

+0

Возможно, вы найдете путь вокруг этого, используя generics и где T: struct, но я думаю, что вы хотите, чтобы ваш интерфейс налагал больше контроля над исполнителями, чем обычно. – hatchet

ответ

1

Нет, нет способа.

Однако вы можете набрать.

Dim nullableIDigitalState As IDigitalState = nothing 

, который будет объявлять переменную типа IDigitalState как null. Если вы говорите о генераторе Nullable<>, который имеет ограничение, ограничивающее типы значений, поэтому он принимает только структурный вариант IDigitalState.

Я пропустил вашу точку?

+0

Я пытался объявить параметр подпрограмме как Nableable IDigitalState, когда IDE жаловалась. Но вы правы, я могу объявить конкретный объект как nullable и передать его в подпрограмму без объявления параметра как NULL. Благодарю. – Ceres

3

Вы можете сделать это в сочетании с дженериками. Например:

Sub Test(Of T As {IDigitalState, Structure})() 
    Dim something As T? = GetEitherValueOrNull … 
End Sub 

Ключевым моментом здесь является то, что вы действуете на бетон (родовое) типа T, который имеет два условия:

  1. это структура, и
  2. он реализует IDigitalState.

Или вы можете просто использовать нормальный переменный тип интерфейса, который может быть Nothing, без необходимости Nullable.

1

Единственными ситуациями, в которых было бы целесообразно ограничить реализацию интерфейсов структурными типами, являются те, в которых тип интерфейса будет использоваться в качестве общего ограничения и никогда не будет использоваться в качестве типа хранилища. В таких ситуациях любой код, который требует, чтобы параметр типа являлся структурой, реализующей интерфейс, может указать это. Ничто не помешало бы классам реализовать интерфейс, но что? Переменная типа IDigitalState может содержать ссылку на класс, реализующий этот интерфейс, но не может быть передан как общий параметр типа T As {Structure,IDigitalState}, поэтому код, требующий реализации структурного типа, не заботится о том, чтобы такие вещи могли существовать.

Обратите внимание, что сохранение структуры, реализующей IDigitalState, в переменную типа IDigitalState, будет эффективно создавать новый объект класса с полями, соответствующими тем, которые имеют структура, и хранить ссылку на этот объект. Если вы хотите убедиться, что структура, которая реализует интерфейс, будет вести себя как структура, а не класс, вам необходимо передать ее или удерживать ее в переменной с универсальным типом интерфейса, а не в переменной типа интерфейса ,

+0

+1 для "хранения структуры, которая реализует IDigitalState в переменной типа IDigitalState, эффективно создаст новый объект класса с полями, соответствующими тем, которые имеют структура, и сохранит ссылку на этот объект. Если вы хотите убедиться, что структура, которая реализует интерфейс, будет вести себя как структура, а не класс, ... " – ToolmakerSteve

Смежные вопросы