2016-07-05 75 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,我可以在列表中使用此輸出所有的數字,但我想改變一個數字的輸出抽獎。

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

我不知道爲什麼你會希望有一個整型定製.ToString()覆蓋......但是

一個簡單的方法來做到這一點是改變您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

謝謝昨晚我正在嘗試,但碰到了一些障礙。今晚晚些時候再試。我想用零填充字符串。我遇到的問題是,當你試圖設置NumsDrawn等於一個整數,它會抱怨你不能設置一個整數爲NumClass(將是你的例子),但我可能只是做一些錯誤的事情。 – Konrad

+0

您的代碼完美無缺。我想我得到的地方我錯了。 ND的New()我將mNumsDrawn設置爲0,butif將其設置爲New NumClass,然後重寫ToString。一個問題,當我做類似myND.NumsDrawn(1)= 1的事情時,它會拋出一個異常,因爲1不是NumClass類型。我必須做myND.NumsDrawn(1)=(New NumClass(1))。有沒有辦法只是使用整數? – Konrad

+0

它的答案是我的問題,只是在課堂上有一個「屬性的方法」。我放入NumClass的任何方法都可以通過簡單地使用myND.mNumsDrawn(1).myMethod()來調用。但我真的需要一種方法來將整數存儲到mNumsDrawn中。 – Konrad

2

你要求的是覆蓋方法ND。雖然這是可能的,但它並不是真正有用的。

更有用的是在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方法,代碼幾乎是一樣的:

這可以如下完成。它只是增加一個重載並不是真的重寫它。就像這樣:

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,但是並沒有因此而去。我認爲這兩個問題都是訪問字符串的代碼再次在類上。它會起作用,但看起來並不直觀。如果可能,我真的很想訪問屬性的Tostring MyDraw.NumsDrawn(1).ToString。我昨晚通過爲Number創建了另一個類,讓它工作起來,但後來出現了兩個問題。我不能很容易地使用NumsDrawn的整數,當我嘗試做一個新例程來初始化NumsDrawn它現在在表單中拋出一個異常。 – Konrad

+0

我會查找擴展名,但是您的示例看起來像創建ND類的方法一樣的結果? – Konrad