2016-07-05 4 views
2

私はこれを最初に検索しましたが、同様の記事がありますが、私の答えは見つかりませんでした。 :(クラス内のプロパティの.ToStringをオーバーライドする方法

は、私は、クラスを持っているとしましょう:。

Public Class ND 
    Private mNumsDrawn = New List(Of Integer) 

    Public Sub New(ByVal vNum As Integer) 
     For i = 1 To vNum 
      mNumsDrawn.Add(0) 
     Next 
    End Sub 

    Public Property NumsDrawn As List(Of Integer) 
     Get 
      Return mNumsDrawn 
     End Get 
     Set(ByVal value As List(Of Integer)) 
      mNumsDrawn = value 
     End Set 
    End Property 
End Class 

私は財産NumsDrawnの.ToStringを上書きしたい

私はそのだけのオーバーライド、クラスに.ToStringオーバーライドを置く場合もちろん、クラスの.ToString。私は出力にリスト内のすべての数字を、これを使用することができますが、私は引き分けで1数の出力を変更したい。

Dim MyDraw = New ND(6) 

MsgBox(MyDraw.ToString) 

しかし、私がしたいですこのようなもの..

MsgBox(MyDraw.NumsDrawn(1).ToString) 

ありがとう!

+1

「MyDraw.NumsDrawn(1).ToString()」の何が問題になっていますか? –

+0

List(Of T)から独自のクラスを派生させる必要があります。それは可能です。なぜNumsDrawnに引数を渡したいのかは、推測するのが非常に難しいです。 –

+0

私は実際に避難所を使用していましたが、以前はリストを使用していましたが、これはすべて配列として設定されていました。 Numsdrawn Newに引数を渡すのは、サイズを設定する必要があり、使用するたびに異なることがありますが、変更されないためです。私はおそらく配列に戻ってくるでしょう。なぜなら、私はそれらをもう少しよく知っていて、一度設定した数は変更されないからです。クラスNDは、より大きなクラスの単なるサブクラスでもありますが、私は質問を単純化しようとしました。主な質問は単なるものではありません.Tostringでは、クラス内のプロパティのメソッドを作成する方法が増えています。私はちょうど別のクラスの方法を作成し、それが行く場所を参照して作業します、ありがとう! – Konrad

答えて

1

...しかし...

これを実行するための簡単な方法が変更に次のようになります。このようなあなたのNumsDrawnList(Of Integer)List(Of NumClass)にして、そのクラスに.ToStringを上書きから:

Public Class ND 
    Private mNumsDrawn As List(Of NumClass) = New List(Of NumClass) 

    Public Sub New(ByVal vNum As Integer) 
     For i = 1 To vNum 
      mNumsDrawn.Add(New NumClass(0)) 
     Next 
    End Sub 

    Public Property NumsDrawn As List(Of NumClass) 
     Get 
      Return mNumsDrawn 
     End Get 
     Set(ByVal value As List(Of NumClass)) 
      mNumsDrawn = value 
     End Set 
    End Property 
End Class 

Public Class NumClass 
    Public Property Value As Integer 
    Public Sub New(value As Integer) 
     Me.Value = value 
    End Sub 
    Public Overrides Function ToString() As String 
     Return "Here is my formatted value: " & Me.Value 
    End Function 
End Class 

用途:

Dim myND As New ND(99) 
    Debug.WriteLine(myND.NumsDrawn(6).ToString()) 'outputs:- Here is my formatted value: 0 
+0

おかげさまで、私はその昨夜を試していましたが、いくつかの障害に遭遇しました。今晩後で試してみよう。文字列に0を埋めたい。私が抱えていた問題は、NumClassに整数を設定できないと不平を言う整数に等しくなるようにSetNumsDrawnをしようとしたときでしたが、おそらくちょうど間違っていました。 – Konrad

+0

あなたのコードは完全に動作します。私はどこが間違っているのか分かります。 NDのNew()はmNumsDrawnを0に設定していましたが、New NumClassに設定してToStringをオーバーライドしました。 1つの質問ですが、私がmyND.NumsDrawn(1)= 1のようなことをすると、1がNumClass型ではないので例外をスローします。私はmyND.NumsDrawn(1)=(New NumClass(1))をしなければならない。整数だけを使用する方法はありますか? – Konrad

+0

そして、私の問題は一般的に、クラス内に「プロパティのメソッド」を持つだけで解決します。私がNumClassに入れたメソッドは、単にmyND.mNumsDrawn(1).myMethod()を使って呼び出すことができます。しかし、実際には整数をmNumsDrawnに格納する方法が本当に必要です。 – Konrad

2

ToString()の方法を無効にすることをお勧めします。NDこれは可能ですが、それは本当に役に立たないIMOです。

さらに役に立つのは、NDに拡張方法を定義することです。拡張メソッドはPublic Module(事実上静的クラス)に配置する必要があることに注意してください。次のように

これは行うことができます。

<Extension> 
Public Function ToFormattedValue(instance As ND, index As Integer) As String 
    Return instance.NumsDrawn(index).ToString() 
End Function 

' Use as: 
MessageBox.Show(MyDraw.ToFormattedValue(1)) 

それでもオーバーライドコードはほぼ同じであるToString方法にしたい場合。オーバーロードを追加するだけでは実際にはオーバーライドしていません。私はあなたが整数型のカスタム.ToString()オーバーライドを持ってしたいと思う理由はわからない

Public Class ND 
    ' Other code here 
    Public Function ToString(index as Integer) As String 
     Return Me.NumsDrawn(1).ToString 
    End Function 
End Class 
+0

ありがとう、私は最後の夜もExtensionを見ていましたが、それにはつながらなかった。私は両方の問題は、文字列にアクセスするコードが再びクラスにあると思う。それは動作しますが、直感的には見えません。可能であれば、MyDraw.NumsDrawn(1).ToStringとしてプロパティのtostringに実際にアクセスしたいと思います。私は、昨夜、Numberの別のクラスを作成して仕事をしましたが、次に2つの問題が発生します。私はNumsDrawnのために整数を使用することはもうできません。NumsDrawnを初期化する新しいルーチンを試してみると、フォームに例外がスローされます。 – Konrad

+0

拡張を検索しますが、例はNDクラスのメソッドを作成するのと同じ結果に見えますか? – Konrad

関連する問題