2011-08-04 22 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

你也许可以找到一个解决这个问题的方法,使用泛型和T:struct,但我认为你希望你的界面对实现者施加比习惯更强的控制权。 – hatchet

回答

1

不,没有办法。

但是,您可以键入。

Dim nullableIDigitalState As IDigitalState = nothing 

这将声明IDigitalState类型的变量为null。如果你在谈论Nullable<>泛型,它具有限制值类型的where限制,所以它只接受IDigitalState的结构变体。

我想念你的观点吗?

+0

当IDE抱怨时,我试图将一个参数声明为子程序作为可空的IDigitalState。但是你是对的,我可以将具体对象声明为可空,并将其传递给子例程而不用将参数声明为可为空。谢谢。 – 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}的通用参数传递,因此需要结构类型实现的代码不会在意可能存在此类事物。

注意,顺便说一句,该存储实现IDigitalStateIDigitalState类型的变量将有效地创建具有匹配那些结构的字段的新的类对象,以及存储该对象的引用的结构体。如果你希望确保实现一个接口的结构将像一个结构而不是一个类一样行为,你需要将它传递或保存在一个带有接口约束的泛型类型的变量中,而不是在接口类型的变量中。

+0

+1“用于将实现IDigitalState的结构存储到IDigitalState类型的变量中将有效地创建一个新的类对象,其中包含与该结构的字段相匹配的字段并存储对该对象的引用如果您希望确保一个struct实现一个接口,将表现得像一个结构而不是一个类,......“ – ToolmakerSteve