物理特性の測定を使用するアプリを構築しています。最初は、「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)
。これは私の問題に関連している可能性があると思います。