以下代码
player2.getWeapon.ToString()
返回
'RockPaperScissors.Rock'
OR
'RockPaperScissors.Paper'
OR
'RockPaperScissors.Scissors'
我只对类名感兴趣,即Rock,Paper或Scissors。我怎样才能做到这一点?
斯普利特是我想到的,但不确定它是否是最好的。
答案 0 :(得分: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
类,那么我会这样做。
答案 1 :(得分: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
答案 2 :(得分: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
的类,则您不希望将其显示给用户。相反,你希望它在文字之间用空格格式化。