2016-10-25 1 views
0

Я сделал класс, чтобы действовать как вариант MathVariant, который будет содержать любое значение, но всегда будет использовать числовое значение (0 или 1) для простой арифметики. Мне все еще нужно больше тестировать с помощью умножения и деления, но кроме этого он работает хорошо.VB.Net make class ведет себя как примитивный тип, например. String или Integer

Я хотел бы для MathVariant вести себя как примитивный тип, поэтому я могу использовать его как обычную переменную. поэтому прямо сейчас, когда я хочу получить значение, я должен получить свойство .Value.

Это пример кода, который я хотел бы, чтобы иметь возможность написать использовать

Dim SomeValue As MathVariant = "12.11" 
Dim AnotherValue As MathVariant = "3" 
Dim Result As MathVariant = SomeValue + AnotherValue 
Console.WriteLine(Result) 'prints MyNameSpace.MathVariant 
Console.WriteLine(Result.Value) 'returns desired result (15.11) 

Я хотел бы просто быть в состоянии использовать экземпляр класса непосредственно получить его значение. Я долго искал и не уверен, что это возможно или как это сделать. Я не уверен, что мне нужно избавиться от свойства Value или если есть зарезервированное имя или что-то, я понимаю, что мой код класса очень длинный, поэтому, если кто-то может объяснить изменения, которые нужно было бы сделать, и, возможно, показать пример суб или двух, которые будут изменены.

Public Class MathVariant 
    Private m_Value As String 

    'public version 
    Public Property Value() As Object 
     Get 
      Dim m_value1 As Double 
      If Double.TryParse(m_Value, m_value1) Then 
       Return m_value1 
      End If 
      Return m_Value 
     End Get 
     Set(value As Object) 
      m_Value = value.ToString() 
     End Set 
    End Property 

    Public Sub New(Value As String) 
     m_Value = Value 
    End Sub 

    Public Shared Widening Operator CType(ByVal value As String) As MathVariant 
      Return New MathVariant(value) 
    End Operator 

    Public Shared Widening Operator CType(ByVal value As Decimal) As MathVariant 
     Return New MathVariant(value.ToString()) 
    End Operator 

    Public Shared Widening Operator CType(ByVal value As Double) As MathVariant 
     Return New MathVariant(value) 
    End Operator 

    Public Shared Widening Operator CType(ByVal value As Integer) As MathVariant 
     Return New MathVariant(value.ToString()) 
    End Operator 

    Public Shared Narrowing Operator CType(ByVal value As MathVariant) As Double 
     Return value.ToDouble() 
    End Operator 

    Public Shared Narrowing Operator CType(ByVal value As MathVariant) As Integer 
     Return Convert.ToInt32(value.ToDouble()) 
    End Operator 

    Public Shared Narrowing Operator CType(ByVal value As MathVariant) As String 
     Return value.Value.ToString() 
    End Operator 

    Public Function ToDouble() As Double 
     Dim test As Double 
     If Double.TryParse(Me.Value.ToString(), test) Then 
      Return test 
     End If 
     Return 0 
    End Function 

    'addition 
    Public Shared Operator +(value1 As MathVariant, value2 As MathVariant) As MathVariant 
     If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then 
      Return value1.ToDouble() + value2.ToDouble() 
     ElseIf TypeOf value1.Value Is Double Then 
      Return value1.ToDouble() + 0.0 
     ElseIf TypeOf value2.Value Is Double Then 
      Return 0.0 + value2.ToDouble() 
     End If 
     Return 0 
    End Operator 

    Public Shared Operator +(value1 As MathVariant, value2 As Object) As MathVariant 
     If TypeOf value1.Value Is Double And TypeOf value2 Is Double Then 
      Return value1.ToDouble() + value2 
     ElseIf TypeOf value2 Is Double Then 
      Return 0.0 + value2 
     End If 
     Return 0.0 
    End Operator 

    Public Shared Operator +(value1 As MathVariant, value2 As Double) As MathVariant 
     If TypeOf value1.Value Is Double Then 
      Return value1.ToDouble() + value2 
     End If 
     Return 0.0 + value2 
    End Operator 

    Public Shared Operator +(value1 As MathVariant, value2 As Integer) As MathVariant 
     If TypeOf value1.Value Is Double Then 
      Return value1.ToDouble() + Convert.ToDouble(value2) 
     End If 
     Return 0.0 + Convert.ToDouble(value2) 
    End Operator 

    'subtraction 
    Public Shared Operator -(value1 As MathVariant, value2 As MathVariant) As MathVariant 
     If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then 
      Return value1.ToDouble() - value2.ToDouble() 
     ElseIf TypeOf value1.Value Is Double Then 
      Return value1.ToDouble() - 0.0 
     ElseIf TypeOf value2.Value Is Double Then 
      Return 0.0 - value2.ToDouble() 
     End If 
     Return 0 
    End Operator 

    Public Shared Operator -(value1 As MathVariant, value2 As Object) As MathVariant 
     If TypeOf value1.Value Is Double And TypeOf value2 Is Double Then 
      Return value1.ToDouble() - value2 
     ElseIf TypeOf value2 Is Double Then 
      Return 0.0 - value2 
     End If 
     Return 0.0 
    End Operator 

    Public Shared Operator -(value1 As MathVariant, value2 As Double) As MathVariant 
     If TypeOf value1.Value Is Double Then 
      Return value1.ToDouble() - value2 
     End If 
     Return 0.0 - value2 
    End Operator 

    Public Shared Operator -(value1 As MathVariant, value2 As Integer) As MathVariant 
     If TypeOf value1.Value Is Double Then 
      Return value1.ToDouble() - Convert.ToDouble(value2) 
     End If 
     Return 0.0 - Convert.ToDouble(value2) 
    End Operator 

    'division 
    Public Shared Operator /(value1 As MathVariant, value2 As MathVariant) As MathVariant 
     If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then 
      Return value1.ToDouble()/value2.ToDouble() 
     ElseIf TypeOf value1.Value Is Double Then 
      Return value1.ToDouble()/1.0 
     ElseIf TypeOf value2.Value Is Double Then 
      Return 1.0/value2.ToDouble() 
     End If 
     Return 0 
    End Operator 

    Public Shared Operator /(value1 As MathVariant, value2 As Object) As MathVariant 
     If TypeOf value1.Value Is Double And TypeOf value2 Is Double Then 
      Return value1.ToDouble()/value2 
     ElseIf TypeOf value2 Is Double Then 
      Return 1.0/value2 
     End If 
     Return 0.0 
    End Operator 

    Public Shared Operator /(value1 As MathVariant, value2 As Double) As MathVariant 
     If TypeOf value1.Value Is Double Then 
      Return value1.ToDouble() + value2 
     End If 
     Return 0.0 + value2 
    End Operator 

    Public Shared Operator /(value1 As MathVariant, value2 As Integer) As MathVariant 
     If TypeOf value1.Value Is Double Then 
      Return value1.ToDouble() + Convert.ToDouble(value2) 
     End If 
     Return 0.0 + Convert.ToDouble(value2) 
    End Operator 

    'multiplication 
    Public Shared Operator *(value1 As MathVariant, value2 As MathVariant) As MathVariant 
     If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then 
      Return value1.ToDouble() * value2.ToDouble() 
     ElseIf TypeOf value1.Value Is Double Then 
      Return value1.ToDouble() * 1.0 
     ElseIf TypeOf value2.Value Is Double Then 
      Return 1.0 * value2.ToDouble() 
     End If 
     Return 1.0 
    End Operator 

    Public Shared Operator *(value1 As MathVariant, value2 As Object) As MathVariant 
     If TypeOf value1.Value Is Double And TypeOf value2 Is Double Then 
      Return value1.ToDouble() * value2 
     ElseIf TypeOf value2 Is Double Then 
      Return 1.0 * value2 
     End If 
     Return 1.0 
    End Operator 

    Public Shared Operator *(value1 As MathVariant, value2 As Double) As MathVariant 
     If TypeOf value1.Value Is Double Then 
      Return value1.ToDouble() + value2 
     End If 
     Return 1.0 * value2 
    End Operator 

    Public Shared Operator *(value1 As MathVariant, value2 As Integer) As MathVariant 
     If TypeOf value1.Value Is Double Then 
      Return value1.ToDouble() * Convert.ToDouble(value2) 
     End If 
     Return 1.0 * Convert.ToDouble(value2) 
    End Operator 


    'less than 
    Public Shared Operator <(value1 As MathVariant, value2 As MathVariant) 
     If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then 
      Return value1.Value < value2.Value 

     ElseIf TypeOf value1.Value Is Double Then 
      Return value1.Value < 0 

     ElseIf TypeOf value2.Value Is Double Then 
      Return 0 < value2.Value 
     End If 
     Return False 
    End Operator 

    Public Shared Operator <(value1 As MathVariant, value2 As Double) 
     If TypeOf value1.Value Is Double Then 
      Return value1.Value < value2 
     Else 
      Return 0 < value2 
     End If 
     Return False 
    End Operator 

    Public Shared Operator <(value1 As MathVariant, value2 As Integer) 
     If TypeOf value1.Value Is Double Then 
      Return value1.Value < Convert.ToDouble(value2) 
     Else 
      Return 0.0 < Convert.ToDouble(value2) 
     End If 
     Return False 
    End Operator 

    'greater than 
    Public Shared Operator >(value1 As MathVariant, value2 As MathVariant) 
     If TypeOf value1.Value Is Double And TypeOf value2.Value Is Double Then 
      Return value1.Value > value2.Value 

     ElseIf TypeOf value1.Value Is Double Then 
      Return value1.Value > 0 

     ElseIf TypeOf value2.Value Is Double Then 
      Return 0 > value2.Value 
     End If 
     Return False 
    End Operator 

    Public Shared Operator >(value1 As MathVariant, value2 As Double) 
     If TypeOf value1.Value Is Double Then 
      Return value1.Value > value2 
     Else 
      Return 0 > value2 
     End If 
     Return False 
    End Operator 

    Public Shared Operator >(value1 As MathVariant, value2 As Integer) 
     If TypeOf value1.Value Is Double Then 
      Return value1.Value > Convert.ToDouble(value2) 
     Else 
      Return 0.0 > Convert.ToDouble(value2) 
     End If 
     Return False 
    End Operator 

    'equal to 
    Public Shared Operator =(value1 As MathVariant, value2 As Object) 
     If TypeOf (value2) Is Double Then 
      Return Convert.ToDouble(value2).Equals(value1.ToDouble()) 
     ElseIf TypeOf (value2) Is String Then 
      Return Convert.ToString(value2).Equals(value1.ToString()) 
     End If 
     Return False 
    End Operator 

    'not equal 
    Public Shared Operator <>(value1 As MathVariant, value2 As Object) 
     Dim m_Type As Type = value2.GetType() 
     If TypeOf (value2) Is Double Then 
      Return Convert.ToDouble(value2).Equals(value1.ToDouble()) 
     ElseIf TypeOf (value2) Is String Then 
      Return Convert.ToString(value2).Equals(value1.ToString()) 
     End If 
     Return False 
    End Operator 
End Class 

EDIT:

Вот ссылка на .NetFiddle я сделал WTH код из выше.

https://dotnetfiddle.net/bFlyhG

+0

Советуем сохранить значение в виде строки. Старайтесь всегда хранить его как фактический числовой тип. - Я не вижу проблемы, с которой вы столкнулись, только то, что арифметика не работает должным образом, так как ваш код показывает «3» вместо любого из двух вы сказали. Хотя я не думаю, что перегрузка оператора возможна, вместо этого используйте операторы преобразования. –

+0

Я, как правило, с вами согласен, к сожалению, я в состоянии оценить одну переменную, которая может быть числом или строкой в ​​виде числа. Проблема в том, что я хотел бы иметь доступ к сохраненному значению, не делая '.Value', поэтому используйте его как' Object' или 'Integer' – Jpsh

+0

Снова я не вижу проблемы. Без '.Value' он работает так же хорошо для меня. Попробуйте переопределить метод ToString(). –

ответ

1

Это, кажется, работает в большинстве случаев, когда вы используете Console.WriteLine() исключением. Переопределение ToString() method, похоже, устраняет проблему.

Public Overrides Function ToString() As String 
    Return m_Value 
End Function 

принять Также совет Андреевский на включение Option Strict (по крайней мере, временно). Поступая таким образом, вы можете увидеть, что нужно исправлять в коде, чтобы он был максимально оптимальным (с точки зрения преобразования).

Смежные вопросы