2011-08-04 6 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のnull可能な型として。私は、インターフェイスがnullableであることが許可されていないクラスによって実装される可能性があるため、なぜこれを行うことができないのか理解しています。インターフェイスを定義して構造体によってのみ実装できるようにする方法はありますか?私はそれが可能だと思っているが、それを検討する価値があると思った。

+0

おそらく、ジェネリックスを使用してT:structを使用する方法が見つかるかもしれませんが、あなたのインタフェースが実装者よりも慣習的なものより多くの制御を加えることを望みます。 – hatchet

答えて

1

ありませんが、方法はありません。

ただし、次のように入力することができます。

Dim nullableIDigitalState As IDigitalState = nothing 

IDigitalState型の変数をnullとして宣言します。 Nullable<>ジェネリックについて言えば、値型に制限するwhere制約があるため、IDigitalStateの構造体バリアントのみを受け入れます。

私はあなたのポイント足りませんか?

+0

私は、IDEが不平を言うと、null可能なIDigitalStateとしてサブルーチンへのパラメータを宣言しようとしていました。しかし、あなたが正しいです、私はnullableとしてパラメータを宣言することなく、nullableとして具体的なオブジェクトを宣言し、サブルーチンに渡すことができます。ありがとう。 – Ceres

3

あなたはジェネリックとの組み合わせでこれを行うことができます。ここでの鍵は、あなたが具体的な(ジェネリック)上で動作していることである

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

二つの条件があるT入力します:たとえば

  1. をそれがIDigitalStateを実装した構造で、かつ

それとも、ただNullableを必要とせずに、Nothingすることができ、インターフェイスタイプ、通常の変数を使用することができます。

1

タイプを構成するインタフェースの実装を制限するために有意義であると思われる唯一の状況は、格納場所型としてインタフェースタイプは、一般的な制約として使用されようとしているもの、及び決してあります。このような状況では、インターフェイスを実装する構造体であるためにtypeパラメータを必要とするコードであれば、それを指定できます。クラスがインターフェイスを実装するのを妨げるものはありませんが、何ですか?タイプIDigitalStateの変数は、そのインタフェースを実装するクラスへの参照を保持することができますが、タイプT As {Structure,IDigitalState}の一般的なパラメータとして渡すことができなかったので、構造型の実装を必要とするコードは、そのようなものが存在する可能性があることを気にしないでしょう。 の型に変数を実装する構造体を格納するbtwは、構造体のフィールドと一致するフィールドを持つ新しいクラスオブジェクトを効果的に作成し、そのオブジェクトへの参照を格納します。インタフェースを実装する構造体がクラスではなく構造体のように動作するようにするには、インタフェース型の変数ではなく、インタフェースに制約のあるジェネリック型の変数で渡したり保持したりする必要があります。

+0

+1 "IDigitalState型の変数にIDigitalStateを実装する構造体を格納すると、構造体のフィールドと一致する新しいクラスオブジェクトが効果的に作成され、そのオブジェクトへの参照が格納されます。インターフェイスは、クラスではなく構造体のように動作します... " – ToolmakerSteve

関連する問題