【问题标题】:How to Override the .ToString of a Property in a Class如何覆盖类中属性的 .ToString
【发布时间】:2016-11-06 21:49:30
【问题描述】:

我确实先搜索了这个并且有一些类似的帖子,但我找不到我的答案。 :(

假设我有一个类:

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)

谢谢!

【问题讨论】:

  • MyDraw.NumsDrawn(1).ToString() 有什么问题?
  • 你必须从 List(Of T) 派生你自己的类。这是可能的。然而,您为什么要向 NumsDrawn 传递参数却很难猜到。
  • 实际上我以前没有使用过列表,这一切都设置为数组。我将一个参数传递给 Numsdrawn New 因为需要设置大小,并且每次使用它都可能不同,但不会改变。我可能会回到数组,因为我对它们有点熟悉,而且数字一旦设置就不会改变。 ND 类也只是一个更大类的子类,我试图简化问题。您的主要问题甚至不仅仅是.Tostring,它更多的是如何为类中的属性创建方法。我将努力创建另一种类方式,看看它的发展方向,谢谢!
  • Alex,我想覆盖 NumsDrawn().ToString,这样我就可以用零填充整数。但更普遍的问题是如何在类中创建属性的方法(可能不是正确的措辞)。类似于 MyDraw.NumsDrawn(1).MyRoutine。我在 ND 类中输入的任何内容都会以 Mydraw.MyRoutine 的形式出现

标签: .net vb.net properties tostring overriding


【解决方案1】:

您要求的是覆盖NDToString() 方法。尽管这是可能的,但 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 方法,代码几乎相同。它并没有真正覆盖它,只是添加了一个重载。像这样:

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

【讨论】:

  • 谢谢,我昨晚也在看 Extension,但没有去。我认为两者的问题是访问 to 字符串的代码再次出现在类上。它会起作用,但似乎不太直观。如果可能的话,我真的很想以 MyDraw.NumsDrawn(1).ToString 的形式访问属性的 tostring。我昨晚通过为 Number 创建另一个类来让它工作,但随后出现了两个问题。我不能再很容易地为 NumsDrawn 使用整数,当我尝试执行一个新例程来初始化 NumsDrawn 它现在在表单中抛出异常。
  • 我会查找扩展,但您的示例看起来与为 ND 类创建方法的结果相同?
【解决方案2】:

我不确定您为什么要在 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

【讨论】:

  • 谢谢我昨晚尝试过,但遇到了一些障碍。今晚晚些时候再试试。我想用零填充字符串。我遇到的问题是,当您尝试将 NumsDrawn 设置为等于整数时,它会抱怨您无法将整数设置为 NumClass(将是您的示例),但我可能只是做错了。
  • 您的代码运行良好。我想我明白了哪里出错了。 ND 的 New() 我将 mNumsDrawn 设置为 0,但如果将其设置为 New NumClass,则它会覆盖 ToString。一个问题,当我执行 myND.NumsDrawn(1) = 1 之类的操作时,它会引发异常,因为 1 不是 NumClass 类型。我必须做 myND.NumsDrawn(1) = (New NumClass(1))。有没有办法只使用整数?
  • 它通常回答了我的问题,即在一个类中只有一个“属性方法”。我在 NumClass 中放置的任何方法都可以通过简单地使用 myND.mNumsDrawn(1).myMethod() 来调用。但我真的需要一种将整数存储到 mNumsDrawn 中的方法。
  • 希望您不要再介意一个问题。我是否认为如果我为 Numclass 创建一个更改 Value 的方法,它会更改调用该方法的 myND.mNumsDrawn(?) 的值?希望我说得通吗? :)
  • Doh,当它应该是 myND.NumsDrawn(1).Value =1 时,我试图做 myND.NumsDrawn(1) = 1。感谢您的帮助,我想我是通过插入您运行良好的代码来解决大部分问题的。很高兴知道它可以工作,所以你继续前进。
猜你喜欢
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多