2016-10-25 6 views
0

私は、任意の値を保持するが、単純な算術には常に数値(0または1)を使用するバリアントMathVariantのように動作するクラスを作った。私はまだ乗算と除算でさらに多くのテストを行う必要がありますが、それ以外はうまくいくようです。VB.Netメイククラスはプリミティブ型のように振る舞います。文字列または整数

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プロパティを取り除かなければならないかどうか、または予約された名前があるかどうか、クラスコードが非常に長いことを認識しているので、誰かが変更を説明して、変更されるサブまたは2つの

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:

ここでは、私は上記のコードWTH作ら.NetFiddleへのリンクです。

https://dotnetfiddle.net/bFlyhG

+0

値を文字列として保存することをお勧めします。常に実際の数値型として格納してください。 - あなたが経験している問題は表示されません。あなたが言った2つのコードのいずれかではなく、コードが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(少なくとも一時的に)を有効にするためのAndrewのアドバイスを受けてください。そうすることで、できるだけ最適なものにするためにコード内で修正する必要のあるものを確認することができます(変換方法)。

関連する問題