2012-12-20 3 views
1

Le code suivantde Split string 'RockPaperScissors.Paper' en vb.net juste récupérer 'Rock'

player2.getWeapon.ToString()

retours

'RockPaperScissors.Rock' 

OU

'RockPaperScissors.Paper' 

OU

'RockPaperScissors.Scissors' 

Je suis simplement intéressé par le nom de la classe, à savoir Rock, Paper ou Scissors. Comment puis-je atteindre cet objectif? Split était ce qui m'est venu à l'esprit mais je ne sais pas si c'est le meilleur.

Répondre

1

ToString est juste une méthode Overridable régulière définie par la classe de base Object. Par conséquent, vous pouvez facilement l'ignorer pour le rendre ce que vous voulez. Par exemple:

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

Ou, si vous voulez forcer vos classes à mettre en œuvre, vous pouvez le faire dans votre base Weapon classe, comme ceci:

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 

Sinon, si vous ne le faites pas Si vous voulez l'exiger dans le constructeur, vous pouvez ajouter un MustOverride Function GetWeaponName() As String protégé dans votre classe de base, puis le renvoyer de ToString. De toute façon, les classes dérivées seront forcées de fournir le nom afin qu'il puisse être retourné dans ToString.

La raison pour laquelle je recommande de le faire est que je suppose que vous utilisez cette chaîne comme description qui est affichée à l'utilisateur. Si c'est le cas, ce n'est pas vraiment le nom de classe que vous voulez, mais une description de l'arme. Jusqu'à présent, ils sont exactement les mêmes, mais logiquement, ce n'est pas toujours le cas. Par exemple, si vous avez une classe appelée SuperDuperRock, vous ne voudrez pas l'afficher comme ça à l'utilisateur. Au contraire, vous voudriez qu'il soit correctement formaté avec des espaces entre les mots.

3

Oui, string.Split semble être la manière appropriée:

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

Mais si vous pouvez prolonger votre Weapon classe avec une propriété qui retourne directement je le faire.

1

Si vraiment vous ne souhaitez pas utiliser de Split(), vous pouvez utiliser IndexOf (plus performant)

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