1

以下代码

player2.getWeapon.ToString()

返回

'RockPaperScissors.Rock'

或者

 'RockPaperScissors.Paper'

或者

'RockPaperScissors.Scissors'

我只对班级名称感兴趣,即 Rock、Paper 或 Scissors。我怎样才能做到这一点?

分裂是我想到的,但不确定它是否是最好的。

4

3 回答 3

3

是的,string.Split似乎是合适的方式:

Dim tokens As String() = player2.getWeapon.ToString().Split("."c)
Dim className As String = tokens.Last() ' or simply tokens(1) without Linq

但是,如果您可以Weapon使用直接返回它的属性来扩展您的类,我会这样做。

于 2012-12-20T23:11:24.717 回答
1

如果你真的不想使用 Split() 你可以使用 IndexOf (性能更高)

Dim className as String    
Dim weapon = player2.getWeapon.ToString()
Dim pos as Integer = weapon.IndexOf("."c)
if pos >= 0 Then 
    className =  weapon.Substring(pos + 1)
End if
于 2012-12-20T23:13:17.903 回答
1

ToString只是基Object类定义的常规可重写方法。因此,您可以轻松地覆盖它以使其返回您想要的任何内容。例如:

Public Class Rock
    Public Overrides Function ToString() As String
        Return "Rock"
    End Function
End Class

或者,如果你想强制你的类实现它,你可以在你的基Weapon类中这样做,如下所示:

Public Class Weapon
    Public Sub New(weaponName As String)
        _weaponName = weaponName
    End Sub

    Private _weaponName As String

    Public Overrides Function ToString() As String
        Return _weaponName
    End Function
End Class

Public Class Rock
    Inherits Weapon

    Public Sub New()
        MyBase.New("Rock")
    End Sub
End Class

或者,如果您不想在构造函数中要求它,您可以MustOverride Function GetWeaponName() As String在基类中添加一个受保护的,然后从ToString. 无论哪种方式,派生类都将被迫提供名称,以便它可以在ToString.

我建议这样做的原因是因为我怀疑您使用此字符串作为显示给用户的描述。如果是这样的话,那并不是你想要的真正的类名,而是武器的描述。到目前为止,它们只是碰巧是相同的,但从逻辑上讲,情况并非总是如此。例如,如果您有一个名为 的类SuperDuperRock,您不会希望像那样向用户显示它。相反,您希望它的格式正确,单词之间有空格。

于 2012-12-21T00:19:55.913 回答