如何在类中覆盖属性的.ToString方法

3

我首先进行了搜索,发现有一些类似的帖子,但是我没有找到我的答案。 :(

假设我有一个类:

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() 有什么问题? - Alex B.
你需要从List(Of T)派生出自己的类。这是可能的。但是为什么你想将参数传递给NumsDrawn却很难猜测。 - Hans Passant
我之前实际上没有使用过列表,都是用数组的。我在传递参数给Numsdrawn New,因为大小需要设置,并且每次使用可能不同,但之后就不会再改变了。我可能会回到使用数组,因为我对它们更熟悉,并且一旦设置了数字,它们就不会再改变。ND类也只是一个更大类的子类,我尽量简化问题。我的主要问题不仅仅是.ToString,更多的是如何在类中创建一个属性的方法。我会尝试创建另一个类并看看情况如何,谢谢! - Konrad
Alex,我想覆盖NumsDrawn().ToString方法,以便我可以用零填充整数。但更一般的问题是如何在类中创建一个属性的方法(可能不是正确的措辞)。类似于MyDraw.NumsDrawn(1).MyRoutine这样的东西。我放在ND类中的任何内容都将变成Mydraw.MyRoutine。 - Konrad
2个回答

4

我不确定为什么你想在Integer类型上自定义.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

谢谢,昨晚我试过了,但遇到了一些问题。今晚再试一下。我想用零填充字符串。我的问题是当你尝试将setNumsDrawn设置为整数时,它会抱怨你不能将整数设置为NumClass(就像你的例子),但我可能做错了什么。 - Konrad
你的代码完美运行。我想我知道我错在哪里了。ND的New()中,我将mNumsDrawn设置为0,但是如果你设置为New NumClass,那么它会覆盖ToString。一个问题,当我做类似myND.NumsDrawn(1) = 1这样的操作时,它会抛出异常,因为1不是NumClass类型的。我必须使用myND.NumsDrawn(1) = (New NumClass(1))。有没有办法仍然只使用整数? - Konrad
这解决了我的一个普遍问题,即在类中只有一个“属性方法”。我在NumClass中放置的任何方法都可以通过使用myND.mNumsDrawn(1).myMethod()来调用。但我真的需要一种将整数存储到mNumsDrawn中的方法。 - Konrad
希望您不介意再问一个问题。如果我为Numclass创建一个改变Value的方法,那么它会改变调用该方法的myND.mNumsDrawn(?)的值吗?希望我的表述清楚明了? :) - Konrad
1
哎呀,我本来想写myND.NumsDrawn(1) = 1,但实际上应该是myND.NumsDrawn(1).Value =1。谢谢你的帮助,我通过不断尝试你的代码已经解决了大部分问题。知道它可以工作真是太好了,这样我就可以继续前进了。 - Konrad

2
你要求的是重写ND类的ToString()方法。虽然这是可能的,但我认为这并不是很有用。
更有帮助的是在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

谢谢,昨晚我也看了Extension,但没有选择它。我认为两者的问题都在于访问字符串的代码再次出现在类中。虽然它可以工作,但似乎不太直观。如果可能的话,我真的想访问属性的tostring,例如MyDraw.NumsDrawn(1).ToString。昨晚我通过为Number创建另一个类来使其正常工作,但是随之出现了两个问题。我不能再很容易地使用整数来进行NumsDrawn,并且当我尝试进行新的例程以初始化NumsDrawn时,它现在会在表单中抛出异常。 - Konrad
我会查找扩展名,但是你的示例看起来与为ND类创建方法的结果相同? - Konrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接