2016-07-05 13 views
2

Ich habe zuerst nach diesem gesucht und es gibt einige ähnliche Beiträge, aber ich konnte meine Antwort nicht finden. :(Wie überschreiben der .ToString einer Eigenschaft in einer Klasse

Können sagen, ich habe eine Klasse:.

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 

ich das .ToString des Objektes NumsDrawn außer Kraft setzen möge

Wenn ich die .ToString Überschreibung in der Klasse setzte dann seine nur zwingenden die Klasse .ToString natürlich. das kann ich alle Zahlen in der Liste Ausgabe verwenden, aber ich mag die Ausgabe einer Zahl in der Auslosung ändern.

Dim MyDraw = New ND(6) 

MsgBox(MyDraw.ToString) 

aber was ich will, ist etwas wie das ..

MsgBox(MyDraw.NumsDrawn(1).ToString) 

Danke!

+1

Was ist falsch mit 'MyDraw.NumsDrawn (1) .ToString()'? –

+0

Sie müssen Ihre eigene Klasse von List (Of T) ableiten. Das ist möglich. Warum Sie NumsDrawn ein Argument übergeben wollen, ist jedoch sehr schwer zu erraten. –

+0

Ich habe tatsächlich keine Listen verwendet und das war alles als Arrays festgelegt. Ich übergebe ein Argument an Numsdrawn New, weil die Größe festgelegt werden muss und es kann jedes Mal unterschiedlich sein, ändert sich dann aber nicht. Ich werde wahrscheinlich zu Arrays zurückkehren, da ich mit ihnen etwas vertrauter bin und die Zahlen sich nicht ändern, sobald sie eingestellt sind. Die Klasse ND ist auch nur eine Unterklasse einer größeren Klasse, ich habe versucht, die Frage zu vereinfachen. y Hauptfrage ist nicht nur einfach .Tostring, es ist mehr, wie Sie eine Methode für eine Eigenschaft in einer Klasse erstellen. Ich werde daran arbeiten, einfach eine andere Klassenmethode zu erstellen und zu sehen, wo es hingeht, danke! – Konrad

Antwort

1

Ich bin mir nicht sicher, warum Sie eine benutzerdefinierte .ToString() Überschreibung auf einem Integer-Typen haben möchten ... aber ...

Ein einfacher Weg, dies zu tun zu ändern wäre, Ihre NumsDrawn von einem List(Of Integer) zu einem List(Of NumClass) und dann die .ToString auf dass Klasse außer Kraft setzen:

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 

Verbrauch:

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

Danke, ich habe das letzte Nacht versucht, aber lief in einige Haken. Wird später versuchen, heute Abend. Ich möchte die Zeichenfolge mit Nullen auffüllen. Das Problem, das ich hatte, war, als Sie versucht haben, NumsDrawn gleich einer Integer zu setzen, es würde sich beschweren, dass Sie keine Integer auf eine NumClass setzen können (wäre Ihr Beispiel), aber ich habe wahrscheinlich nur etwas falsch gemacht. – Konrad

+0

Ihr Code funktioniert einwandfrei. Ich denke, ich komme dahin, wo ich falsch liege. The New() für ND Ich setzte mNumsDrawn auf 0, aber wenn Sie es auf New NumClass setzen, dann überschreibt es die ToString. Eine Frage, wenn ich etwas wie myND.NumsDrawn (1) = 1 mache, löst es eine Ausnahme aus, weil 1 nicht vom Typ NumClass ist. Ich muss tun myND.NumsDrawn (1) = (New NumClass (1)). Gibt es eine Möglichkeit, Integers nur noch zu verwenden? – Konrad

+0

Und seine Antwort mein Problem im Allgemeinen mit nur eine "Methode einer Eigenschaft" in einer Klasse. Jede Methode, die ich in NumClass einsetze, kann ich einfach mit myND.mNumsDrawn (1) .myMethod() aufrufen. Aber ich brauche wirklich eine Möglichkeit, ganze Zahlen in mNumsDrawn zu speichern. – Konrad

2

Was Sie fordern, ist die ToString() Methode von ND zu überschreiben. Obwohl dies möglich ist, ist es IMO nicht wirklich hilfreich.

Was hilfreicher ist, ist die Definition einer Erweiterungsmethode unter ND. Beachten Sie, dass eine Erweiterungsmethode in eine Public Module platziert werden muss (was effektiv eine statische Klasse ist).

Dies kann wie folgt geschehen:

<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)) 

Wenn Sie noch Überschreibung die ToString Methode wollen, der Code ist fast das gleiche. Es ist nicht wirklich außer Kraft gesetzt, nur eine Überladung hinzuzufügen. Wie folgt aus:

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

Danke, ich habe gestern Abend auch Extension angeschaut, bin aber nicht damit gefahren. Ich denke, das Problem mit beiden ist der Code für den Zugriff auf die Zeichenkette ist wieder in der Klasse. Es wird funktionieren, aber es scheint nicht ganz intuitiv zu sein. Ich würde gerne auf die Eigenschaft der Eigenschaft als MyDraw.NumsDrawn (1) .ToString wenn möglich zugreifen. Ich habe es letzte Nacht irgendwie geschafft, indem ich eine andere Klasse für Number erstellt habe, aber dann tauchen zwei Probleme auf. Ich kann Integer für NumsDrawn nicht mehr sehr einfach verwenden und wenn ich versuche, eine Neue Routine zu initialisieren, NumsDrawn Es wirft jetzt eine Ausnahme in das Formular. – Konrad

+0

Ich werde nach Erweiterung suchen, aber Ihr Beispiel sieht genauso aus, als ob Sie nur eine Methode für die ND-Klasse erstellen würden. – Konrad

Verwandte Themen