Преобразование единиц измерения - Структура класса в VB.net

Я работаю над модулем преобразования единиц. Я нашел здесь несколько хороших идей, а также на CodeProject. Мой код очень похож на этот код C # на http://www.codeproject.com/KB/cs/Unit_Conversion_Sample.aspx Из следующего вы, вероятно, поймете, что я новичок в программировании :)

Я создал базовый класс 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

Затем я наследую этот класс, чтобы начать создавать единицы с включенной функцией преобразования единиц.

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

Мне нужно создать несколько различных типов единиц, таких как длина, давление и т. Д. Это работает хорошо, за исключением одной проблемы. Я хотел бы иметь возможность изменять UnitType и автоматически обновлять UnitValue. Таким образом, если объект Unit имеет значение 1 и тип Inch, а тип изменяется на Cm, значение будет обновлено до 2,54.

Что-то вроде этого .... Я видел примеры этого, но разница здесь в том, что я не могу указать функцию Covert в моем базовом классе, потому что она изменяется с каждым новым созданным мной UnitClass.

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 Overridable и создать новое свойство Override для UnitType в каждом созданном мной UnitClass, но мне не удалось заставить это работать.

Любые предложения очень ценятся. Большое спасибо!


person GetFuzzy    schedule 14.09.2011    source источник
comment
Я нашел способ сделать это, но я не могу ответить себе еще 8 часов, потому что у меня еще недостаточно репутации. Чтобы быть кратким, я немного изменил свой код и использовал функцию, которая возвращает логическое значение True или False, в этой функции я установил UnitValue = на преобразованный UnitValue, а затем я установил UnitType = на новый выбранный тип. Я отправлю свой код, когда смогу.   -  person GetFuzzy    schedule 14.09.2011


Ответы (1)


Я отвечаю на свои вопросы, поскольку нашел способ выполнить обновление UnitValue и UnitType, немного изменив код. Я разбил функцию преобразования на две части. Сначала я создал функцию WeightConversion, которая просто возвращает Double.

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 просто изменяет значения существующего объекта вместо создания нового объекта.

Мне все равно было бы интересно услышать другие идеи по преобразованию единиц измерения ...

person GetFuzzy    schedule 14.09.2011