2

物理特性の測定を使用するアプリを構築しています。最初は、「double」型の変数を大量に使用し、ハンガリー語表記または頭の中で値を追跡しました。

Public Class ResultData
    Public Property position_in_mm_vs_time_in_ms as Double(,)
    Public Property initial_position_in_mm as Double
    Public Property final_position_in_mm as Double
    Public Property duration_in_ms as Double
    Public Property speed_in_mm_per_s as Double
End Class

しかし、より多くのアイテムとより多くのプロパティを追加すると、これはすぐに混乱し、変換係数が散らばり、値がメートル単位であるかミランプ単位であるかを知る方法がなくなり、ハードコーディングなしではアイテムの適切な略語が何であるかを知る方法がなくなりました. SI または帝国単位でデータを入力および出力するオプションを追加するというアイデアは恐ろしいものでした。

この問題は型付けの問題であり、型と値を持つクラスを使用してこの配置を改善できることに気付きました。

Namespace Measure
    Public Class Value(Of GenericUnits)
        Public Property Value As Double
    End Class
    Public Class ValuePoint(Of XUnits, YUnits)
        Public X As Value(Of XUnits)
        Public Y As Value(Of YUnits)
        Public Sub New(x As Value(Of XUnits), y As Value(Of YUnits))
            Me.X = x
            Me.Y = y
        End Sub
    End Class
    Public Class Units
        Public Interface GenericUnits
            ReadOnly Property Abbreviation As String
            ' Additional properties, operators, and conversion functions
        End Interface
        ' Additional unit types
    End Class
End Namespace

だから私の宣言は次のようになりました:

Public Class ResultData
    Public Property PositionData as List(of ValuePoint(of Units.Seconds, Units.Millimeters))
    Public Property InitialPosition as Value(of Units.Millimeters)
    Public Property FinalPosition as Value(of Units.Millimeters)
    Public Property Duration as Value(of Units.Milliseconds)
    Public Property Speed as Value(of Units.MillimetersPerSecond)
End Class

これは本当に素晴らしくてきれいです。演算子によって定義されたプロパティと変換を使用したいのですが、できません:

Dim result As New ResultData()
Dim msg As New System.Text.StringBuilder()
msg.AppendLine("Speed units are abbreviated as: ")
msg.AppendLine(result.Speed.GetType().ToString() & "?")
msg.AppendLine(result.Speed.GetType().GenericTypeArguments(0).ToString() & "?")
' Produces error "Abbreviation is not a member of System.Type"
' Casting produces conversion error
'msg.AppendLine(result.Speed.GetType().GenericTypeArguments(0).Abbreviation & "?")
' Produces:
'   Speed units are abbreviated as:
'   Measure.Value`1[Measure.Units+MillimetersPerSecond]
'   Measure.Units+MillimetersPerSecond
MsgBox(msg.ToString())

型宣言のプロパティとメソッドにアクセスするにはどうすればよいですか?

私の宣言Value(Of GenericUnits)は、実際には というインターフェイスを参照しておらずGenericUnits、代わりにジェネリック型を生成していることがわかりました。私はそれを呼ぶかもしれませんValue(Of T)。これは私の問題に関連している可能性があると思います。

4

2 に答える 2

2

インターフェイスから派生するようにジェネリックを制約する必要があります。

Public Class Measurement(Of T as IGenericUnits) 'class name was Value before edit 
    Public Property Value As Double
    Public Property UOM As IGenericUnits 'UOM is a common abbreviation for unit-of-measure
End Class

ジェネリックと制約に関する追加情報については、こちらを参照してください: http://msdn.microsoft.com/en-us/library/w256ka79.aspx


編集:

使用法は次のようになります。

msg.AppendLine(result.Speed.UOM.Abbreviation)

いくつかの推奨事項:

  1. 推奨される命名規則に従うように名前GenericUnitsを変更しますIGenericUnits

  2. Value" for your measurement class.代わりに、 Value is used all over the place and you are bound to run into a naming conflict eventually. PerhapsMeasurement orMeasuredValue`よりも適切な名前を見つけてください。

于 2013-10-08T14:21:04.937 に答える