0

私は単位変換モジュールに取り組んでいます。CodeProject だけでなく、ここでもいくつかの良いアイデアを見つけました。私のコードは、 http://www.codeproject.com/KB/cs/Unit_Conversion_Sample.aspxにあるこの C# コードと非常によく似てい ます。次の内容から、私がプログラミングの初心者であることがわかるでしょう :)

各ユニット タイプを作成するために継承する Units 基本クラスを作成しました。

Public Class Units
Private _unitvalue As Double
Private _unittype As [Enum]

Public Sub New(UnitValue As Double, UnitType As [Enum])
    _unitvalue = UnitValue
    _unittype = UnitType
End Sub

Public Property UnitValue() As Double
    Get
        Return _unitvalue
    End Get
    Set(value As Double)
        _unitvalue = value
    End Set
End Property

Public Property UnitType() As [Enum]
    Get
        Return _unittype
    End Get
    Set(value As [Enum])
        _unittype = value
    End Set
End Property

Public Overrides Function ToString() As String
    Return String.Format("{0} {1}", UnitValue.ToString(), UnitType.ToString())
End Function

End Class

次に、このクラスを継承して、Unit 変換関数を組み込んだ Unit の作成を開始します。

Public Class WeightUnit
Inherits Units
Enum WeightSym
    'Pounds
    Lbs
    'Kilograms
    Kg
End Enum
Sub New(UnitValue As Double, UnitType As WeightSym)
    MyBase.New(UnitValue, UnitType)
End Sub
Public Function Convert(toUnit As WeightSym) As WeightUnit
    'Base Weight Unit is Lbs

    Dim fromUnit As WeightSym
    fromUnit = UnitType

    Dim Lbs As Double = 0
    Select Case fromUnit
        'Standard
        Case WeightSym.Lbs
            Lbs = UnitValue
        Case WeightSym.Kg
            Lbs = UnitValue * 2.2046226
    End Select

    Dim toVal As Double = 0
    'to unit based on Lbs
    Select Case toUnit
        'Standard
        Case WeightSym.Lbs
            toVal = Lbs
        Case WeightSym.Kg
            toVal = Lbs * 0.4535924
    End Select
    Return New WeightUnit(toVal, toUnit)
End Function
End Class

長さ、圧力など、いくつかの異なる単位タイプを作成する必要があります。これは、1 つの問題を除いてうまく機能しています。UnitType を変更して、UnitValue を自動的に更新できるようにしたいと考えています。Unit オブジェクトの値が 1 でタイプが Inch の場合、タイプが Cm に変更されると、値は 2.54 に更新されます。

このようなもの....この例を見てきましたが、ここでの違いは、作成する新しい UnitClass ごとに変更されるため、基本クラスで Covert 関数を指定できないことです。

Public Property UnitType() As [Enum]
Get
    Return _unittype
End Get
Set(value As [Enum])
    _unittype = value
    _unitvalue = Convert(value).UnitValue
End Set
End Property

プロパティの UnitType をオーバーライド可能にして、作成した各 UnitClass で UnitType の新しいオーバーライド プロパティを作成しようとしましたが、うまくいきませんでした。

どんな提案でも大歓迎です。どうもありがとう!

4

1 に答える 1

0

コードを少し並べ替えることで、UnitValueとUnitTypeを更新する方法を見つけたので、私は自分の質問に答えています。ConvertFunctionを2つに分割しました。最初に、Doubleを返すだけのWeightConversion関数を作成しました。

Public Function WeightConversion(Quantity As Double,fromUnit As WeightSym,_
toUnit As WeightSym) As Double
'Base Weight Unit is Lbs

Dim fromUnit As WeightSym
fromUnit = UnitType

Dim Lbs As Double = 0
Select Case fromUnit
    'Standard
    Case WeightSym.Lbs
        Lbs = Quantity
    Case WeightSym.Kg
        Lbs = Quantity * 2.2046226
End Select

Dim toVal As Double = 0
'to unit based on Lbs
Select Case toUnit
    'Standard
    Case WeightSym.Lbs
        toVal = Lbs
    Case WeightSym.Kg
        toVal = Lbs * 0.4535924
End Select
Return toVal
End Function

次に、次のような関数を作成しました...私の実装では、基本クラスでオーバーライド可能な関数を作成し、それを以下でオーバーライドします。

Public Function ToUnit(toType As LengthSym) As Boolean
    'First Set UnitValue 
    Me.UnitValue = LengthConversion(Me.UnitValue, Me.UnitType, toType)
    'Then Set the UnitType to the newly choosen unit
    Me.UnitType = toType
    Return True
End Function

これにより、私が探していた効果が得られました...別のUnitTypeに変換すると、新しいオブジェクトを作成するのではなく、既存のオブジェクトの値が変更されるだけです。

私はまだ単位変換のための他のアイデアを聞くことに興味があります...

于 2011-09-14T16:30:44.990 に答える