以下代码
player2.getWeapon.ToString()
返回
'RockPaperScissors.Rock'
或者
'RockPaperScissors.Paper'
或者
'RockPaperScissors.Scissors'
我只对班级名称感兴趣,即 Rock、Paper 或 Scissors。我怎样才能做到这一点?
分裂是我想到的,但不确定它是否是最好的。
是的,string.Split
似乎是合适的方式:
Dim tokens As String() = player2.getWeapon.ToString().Split("."c)
Dim className As String = tokens.Last() ' or simply tokens(1) without Linq
但是,如果您可以Weapon
使用直接返回它的属性来扩展您的类,我会这样做。
如果你真的不想使用 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
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
,您不会希望像那样向用户显示它。相反,您希望它的格式正确,单词之间有空格。