2011-09-16 17 views
1

私はgenericsを処理するためのベースクラスを設計するいくつかの問題があります。注意しなければならないのは、Int16、Int32、またはInt64(ShortまたはLong)のような数値型の型を制限する必要があるということです。VB.Net一般的な制限

私はあなたがOf T as {Structure}を行うことができると知っていますが、タイプとして非整数を許可したくありません。

何か提案がありますか?

答えて

1

私が考えているのは、Friendジェネリッククラスを作成し、そこから継承する6つのクラスを構築することです。 Friendは、そのプロジェクトを含むプロジェクトを除いて、メンバーを非公開にします。これにより、プロジェクトの外部にあるものが例えばIntXClass(Of Double)としてインスタンス化されなくなります。

Friend Class IntXClass(Of T As Structure) 
    ' TODO: Define all IntXClass members. 
End Class 

Public Class Int16Class 
    Inherits IntXClass(Of Int16) 
End Class 

Public Class Int32Class 
    Inherits IntXClass(Of Int32) 
End Class 

Public Class Int64Class 
    Inherits IntXClass(Of Int64) 
End Class 

Public Class UInt16Class 
    Inherits IntXClass(Of UInt16) 
End Class 

Public Class UInt32Class 
    Inherits IntXClass(Of UInt32) 
End Class 

Public Class UInt64Class 
    Inherits IntXClass(Of UInt64) 
End Class 
+0

ええ、それについては考えましたが、配列にサイズを割り当てる正の数全体を取る1つの基本クラスを持つことを考えていました。私は、この基本クラスを継承するいくつかの事前設定された派生クラスを持っていますが、エンドユーザーのカスタマイズ可能な汎用クラスとしても使用できます。 SQLの数値(P、S)型に似ています。他のすべての数値型は、実際には数値型のバリエーションだけです。 – GoldBishop

+0

私は少し混乱しています。これは、 "配列にサイズを割り当てる正の数全体を取る1つの基本クラス"を達成するのに失敗しますか?それはコンストラクタの一部にすぎませんか? –

0

.Netには、制約の有無にかかわらず、数値型よりも一般的に有用なサポートがありません。 This libraryは実装の面で役立つかもしれませんが、制約の定義という点ではまだ幸運です。

あなたが本当に窮屈な場合は、静的なコンストラクタの型パラメータをチェックして、それが許容できない場合はスローして、間違ってインスタンス化しようとしている人のためにTypeLoadExceptionになります。

+0

どうすれば比較できますか? パラメータを 'Type'とし、' param is GetType(Int16) 'のようにするとどうなりますか? 私はparamを 'Object'として渡すかのように思えるので、' TypeOf(param)Is Int16'をしなければなりません。 オブジェクト/タイプとして値を渡すプロ/コンはどうなりますか? – GoldBishop

関連する問題