2016-07-05 76 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